Skip to content

Commit c4754c3

Browse files
committed
more LoggerFactory disposal improvements
1 parent 62aa143 commit c4754c3

File tree

3 files changed

+28
-4
lines changed

3 files changed

+28
-4
lines changed

src/WebJobs.Script.WebHost/App_Start/AutofacBootstrap.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ internal static void Initialize(ScriptSettingsManager settingsManager, Container
2929
builder.Register<ISwaggerDocumentManager>(ct => ct.Resolve<WebHostResolver>().GetSwaggerDocumentManager(settings)).ExternallyOwned();
3030
builder.Register<WebScriptHostManager>(ct => ct.Resolve<WebHostResolver>().GetWebScriptHostManager(settings)).ExternallyOwned();
3131
builder.Register<WebHookReceiverManager>(ct => ct.Resolve<WebHostResolver>().GetWebHookReceiverManager(settings)).ExternallyOwned();
32-
builder.Register<ILoggerFactory>(ct => ct.Resolve<WebHostResolver>().GetScriptHostConfiguration(settings).HostConfig.LoggerFactory).ExternallyOwned();
32+
builder.Register<ILoggerFactory>(ct => ct.Resolve<WebHostResolver>().GetLoggerFactory(settings)).ExternallyOwned();
3333
}
3434
}
3535
}

src/WebJobs.Script.WebHost/App_Start/WebHostResolver.cs

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
using Microsoft.Azure.WebJobs.Script.Eventing;
1010
using Microsoft.Azure.WebJobs.Script.WebHost.Properties;
1111
using Microsoft.Azure.WebJobs.Script.WebHost.WebHooks;
12+
using Microsoft.Extensions.Logging;
1213

1314
namespace Microsoft.Azure.WebJobs.Script.WebHost
1415
{
@@ -28,13 +29,31 @@ public sealed class WebHostResolver : IDisposable
2829

2930
private static ScriptSettingsManager _settingsManager;
3031

32+
private static ILoggerFactory _emptyLoggerFactory = new LoggerFactory();
33+
3134
public WebHostResolver(ScriptSettingsManager settingsManager, ISecretManagerFactory secretManagerFactory, IScriptEventManager eventManager)
3235
{
3336
_settingsManager = settingsManager;
3437
_secretManagerFactory = secretManagerFactory;
3538
_eventManager = eventManager;
3639
}
3740

41+
public ILoggerFactory GetLoggerFactory(WebHostSettings settings)
42+
{
43+
WebScriptHostManager manager = GetWebScriptHostManager(settings);
44+
45+
if (!manager.CanInvoke())
46+
{
47+
// The host is still starting and the LoggerFactory cannot be used. Return
48+
// an empty LoggerFactory rather than waiting. This will mostly affect
49+
// calls to /admin/host/status, which do not block on CanInvoke. It allows this
50+
// API to remain fast with the side effect of occassional missed logs.
51+
return _emptyLoggerFactory;
52+
}
53+
54+
return GetScriptHostConfiguration(settings).HostConfig.LoggerFactory;
55+
}
56+
3857
public ISwaggerDocumentManager GetSwaggerDocumentManager(WebHostSettings settings)
3958
{
4059
return GetWebScriptHostManager(settings).SwaggerDocumentManager;

src/WebJobs.Script/Host/ScriptHost.cs

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1780,8 +1780,6 @@ protected override void Dispose(bool disposing)
17801780
(function.Invoker as IDisposable)?.Dispose();
17811781
}
17821782

1783-
_loggerFactory?.Dispose();
1784-
17851783
if (_traceMonitor != null)
17861784
{
17871785
_hostConfig.Tracing.Tracers.Remove(_traceMonitor);
@@ -1796,9 +1794,16 @@ protected override void Dispose(bool disposing)
17961794
}
17971795
}
17981796

1799-
// dispose base last to ensure that errors there don't
1797+
// dispose base here to ensure that errors there don't
18001798
// cause us to not dispose ourselves
18011799
base.Dispose(disposing);
1800+
1801+
if (disposing)
1802+
{
1803+
// The LoggerFactory can be used by the host up until it's disposed,
1804+
// so make sure that it's disposed last.
1805+
_loggerFactory?.Dispose();
1806+
}
18021807
}
18031808
}
18041809
}

0 commit comments

Comments
 (0)