2
2
// Licensed under the MIT License. See License.txt in the project root for license information.
3
3
4
4
using System ;
5
+ using System . Collections . Concurrent ;
5
6
using System . Diagnostics ;
6
7
using Microsoft . Azure . WebJobs . Script ;
7
8
@@ -16,8 +17,12 @@ namespace Microsoft.Extensions.Logging
16
17
[ DebuggerDisplay ( @"InnerFactory = \{ {_inner} \}, ScriptHostState = {_manager.State}" ) ]
17
18
public sealed class ForwardingLoggerFactory : ILoggerFactory
18
19
{
20
+ private readonly ConcurrentDictionary < string , ForwardingLogger > _loggers = new ( StringComparer . Ordinal ) ;
19
21
private readonly ILoggerFactory _inner ;
20
22
private readonly IScriptHostManager _manager ;
23
+ private readonly object _sync = new ( ) ;
24
+
25
+ private bool _disposed ;
21
26
22
27
public ForwardingLoggerFactory ( ILoggerFactory inner , IScriptHostManager manager )
23
28
{
@@ -34,12 +39,30 @@ public void AddProvider(ILoggerProvider provider)
34
39
35
40
/// <inheritdoc />
36
41
public ILogger CreateLogger ( string categoryName )
37
- => new ForwardingLogger ( categoryName , _inner . CreateLogger ( categoryName ) , _manager ) ;
42
+ {
43
+ ObjectDisposedException . ThrowIf ( _disposed , this ) ;
44
+
45
+ if ( ! _loggers . TryGetValue ( categoryName , out ForwardingLogger ? logger ) )
46
+ {
47
+ lock ( _sync )
48
+ {
49
+ if ( ! _loggers . TryGetValue ( categoryName , out logger ) )
50
+ {
51
+ ILogger innerLogger = _inner . CreateLogger ( categoryName ) ;
52
+ logger = new ForwardingLogger ( categoryName , innerLogger , _manager ) ;
53
+ _loggers [ categoryName ] = logger ;
54
+ }
55
+ }
56
+ }
57
+
58
+ return logger ;
59
+ }
38
60
39
61
/// <inheritdoc />
40
62
public void Dispose ( )
41
63
{
42
- // no op.
64
+ // this is just to block further logger creation.
65
+ _disposed = true ;
43
66
}
44
67
}
45
68
}
0 commit comments