3
3
4
4
using System ;
5
5
using System . Collections . Generic ;
6
+ using System . Diagnostics ;
6
7
using System . IO ;
7
8
using System . Threading ;
8
9
using System . Threading . Tasks ;
10
+ using Microsoft . Azure . WebJobs . Host ;
9
11
using Microsoft . Azure . WebJobs . Script . Config ;
10
12
using Microsoft . Azure . WebJobs . Script . Eventing ;
13
+ using Microsoft . Azure . WebJobs . Script . WebHost . Diagnostics ;
11
14
using Microsoft . Azure . WebJobs . Script . WebHost . Properties ;
12
15
using Microsoft . Azure . WebJobs . Script . WebHost . WebHooks ;
13
16
using Microsoft . Extensions . Logging ;
@@ -28,6 +31,7 @@ public sealed class WebHostResolver : IDisposable
28
31
private ScriptHostConfiguration _activeScriptHostConfig ;
29
32
private WebScriptHostManager _activeHostManager ;
30
33
private WebHookReceiverManager _activeReceiverManager ;
34
+ private TraceWriter _defaultTraceWriter ;
31
35
private Timer _specializationTimer ;
32
36
33
37
public WebHostResolver ( ScriptSettingsManager settingsManager , ISecretManagerFactory secretManagerFactory , IScriptEventManager eventManager )
@@ -53,6 +57,33 @@ public ILoggerFactory GetLoggerFactory(WebHostSettings settings)
53
57
return GetScriptHostConfiguration ( settings ) . HostConfig . LoggerFactory ;
54
58
}
55
59
60
+ public TraceWriter GetTraceWriter ( WebHostSettings settings )
61
+ {
62
+ // if we have an active host, return it's fully configured
63
+ // trace writer
64
+ var hostManager = GetWebScriptHostManager ( settings ) ;
65
+ var traceWriter = hostManager . Instance ? . TraceWriter ;
66
+
67
+ if ( traceWriter != null )
68
+ {
69
+ return traceWriter ;
70
+ }
71
+
72
+ // if there is no active host, return the default trace writer
73
+ if ( _defaultTraceWriter == null )
74
+ {
75
+ lock ( _syncLock )
76
+ {
77
+ if ( _defaultTraceWriter == null )
78
+ {
79
+ _defaultTraceWriter = CreateDefaultTraceWriter ( settings ) ;
80
+ }
81
+ }
82
+ }
83
+
84
+ return _defaultTraceWriter ;
85
+ }
86
+
56
87
public ISwaggerDocumentManager GetSwaggerDocumentManager ( WebHostSettings settings )
57
88
{
58
89
return GetWebScriptHostManager ( settings ) . SwaggerDocumentManager ;
@@ -191,6 +222,23 @@ internal static ScriptHostConfiguration CreateScriptHostConfiguration(WebHostSet
191
222
return scriptHostConfig ;
192
223
}
193
224
225
+ private TraceWriter CreateDefaultTraceWriter ( WebHostSettings settings )
226
+ {
227
+ // need to set up a default trace writer that logs both host logs and system logs
228
+ var config = GetScriptHostConfiguration ( settings ) ;
229
+ var systemEventGenerator = config . HostConfig . GetService < IEventGenerator > ( ) ?? new EventGenerator ( ) ;
230
+ TraceWriter systemTraceWriter = new SystemTraceWriter ( systemEventGenerator , _settingsManager , TraceLevel . Verbose ) ;
231
+
232
+ // Note that we're creating a logger here that is independent of log configuration settings
233
+ // since we haven't read config yet. This logger is independent on the host having been started.
234
+ // That does mean that even if file logging is disabled, some logs might get written to the file system
235
+ // but that's ok.
236
+ string hostLogFilePath = Path . Combine ( config . RootLogPath , "Host" ) ;
237
+ TraceWriter fileTraceWriter = new FileTraceWriter ( hostLogFilePath , config . HostConfig . Tracing . ConsoleLevel ) ;
238
+
239
+ return new CompositeTraceWriter ( new [ ] { systemTraceWriter , fileTraceWriter } ) ;
240
+ }
241
+
194
242
/// <summary>
195
243
/// Helper function used to manage active/standby transitions for objects managed
196
244
/// by this class.
@@ -269,6 +317,7 @@ public void Dispose()
269
317
_activeHostManager ? . Dispose ( ) ;
270
318
_activeReceiverManager ? . Dispose ( ) ;
271
319
_specializationTimer ? . Dispose ( ) ;
320
+ ( ( IDisposable ) _defaultTraceWriter ) ? . Dispose ( ) ;
272
321
}
273
322
}
274
323
}
0 commit comments