33
44using System ;
55using System . Collections . Generic ;
6+ using System . Diagnostics ;
67using System . IO ;
78using System . Threading ;
89using System . Threading . Tasks ;
10+ using Microsoft . Azure . WebJobs . Host ;
911using Microsoft . Azure . WebJobs . Script . Config ;
1012using Microsoft . Azure . WebJobs . Script . Eventing ;
13+ using Microsoft . Azure . WebJobs . Script . WebHost . Diagnostics ;
1114using Microsoft . Azure . WebJobs . Script . WebHost . Properties ;
1215using Microsoft . Azure . WebJobs . Script . WebHost . WebHooks ;
1316using Microsoft . Extensions . Logging ;
@@ -28,6 +31,7 @@ public sealed class WebHostResolver : IDisposable
2831 private ScriptHostConfiguration _activeScriptHostConfig ;
2932 private WebScriptHostManager _activeHostManager ;
3033 private WebHookReceiverManager _activeReceiverManager ;
34+ private TraceWriter _defaultTraceWriter ;
3135 private Timer _specializationTimer ;
3236
3337 public WebHostResolver ( ScriptSettingsManager settingsManager , ISecretManagerFactory secretManagerFactory , IScriptEventManager eventManager )
@@ -53,6 +57,33 @@ public ILoggerFactory GetLoggerFactory(WebHostSettings settings)
5357 return GetScriptHostConfiguration ( settings ) . HostConfig . LoggerFactory ;
5458 }
5559
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+
5687 public ISwaggerDocumentManager GetSwaggerDocumentManager ( WebHostSettings settings )
5788 {
5889 return GetWebScriptHostManager ( settings ) . SwaggerDocumentManager ;
@@ -191,6 +222,23 @@ internal static ScriptHostConfiguration CreateScriptHostConfiguration(WebHostSet
191222 return scriptHostConfig ;
192223 }
193224
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+
194242 /// <summary>
195243 /// Helper function used to manage active/standby transitions for objects managed
196244 /// by this class.
@@ -269,6 +317,7 @@ public void Dispose()
269317 _activeHostManager ? . Dispose ( ) ;
270318 _activeReceiverManager ? . Dispose ( ) ;
271319 _specializationTimer ? . Dispose ( ) ;
320+ ( ( IDisposable ) _defaultTraceWriter ) ? . Dispose ( ) ;
272321 }
273322 }
274323}
0 commit comments