Skip to content

Commit 00df9de

Browse files
yelobaustinlparker
authored andcommitted
Pass the GlobalTracerAccessor into OpenTracingLogger so that the NoopTracer is not cached when the tracer hasn't been configured yet and logger providers are resolved. (#50)
1 parent 7f292f6 commit 00df9de

File tree

2 files changed

+14
-16
lines changed

2 files changed

+14
-16
lines changed

src/OpenTracing.Contrib.NetCore/Logging/OpenTracingLogger.cs

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,19 +2,21 @@
22
using System.Collections.Generic;
33
using Microsoft.Extensions.Logging;
44
using OpenTracing.Contrib.NetCore.Internal;
5+
using OpenTracing.Noop;
6+
using OpenTracing.Util;
57

68
namespace OpenTracing.Contrib.NetCore.Logging
79
{
810
internal class OpenTracingLogger : ILogger
911
{
1012
private const string OriginalFormatPropertyName = "{OriginalFormat}";
1113

12-
private readonly ITracer _tracer;
1314
private readonly string _categoryName;
15+
private readonly IGlobalTracerAccessor _globalTracerAccessor;
1416

15-
public OpenTracingLogger(ITracer tracer, string categoryName)
17+
public OpenTracingLogger(IGlobalTracerAccessor globalTracerAccessor, string categoryName)
1618
{
17-
_tracer = tracer;
19+
_globalTracerAccessor = globalTracerAccessor;
1820
_categoryName = categoryName;
1921
}
2022

@@ -26,8 +28,10 @@ public IDisposable BeginScope<TState>(TState state)
2628
public bool IsEnabled(LogLevel logLevel)
2729
{
2830
// Filtering should be done via the general Logging filtering feature.
29-
30-
return !_tracer.IsNoopTracer();
31+
ITracer tracer = _globalTracerAccessor.GetGlobalTracer();
32+
return !(
33+
(tracer is NoopTracer) ||
34+
(tracer is GlobalTracer && !GlobalTracer.IsRegistered()));
3135
}
3236

3337
public void Log<TState>(LogLevel logLevel, EventId eventId, TState state, Exception exception, Func<TState, Exception, string> formatter)
@@ -38,7 +42,8 @@ public void Log<TState>(LogLevel logLevel, EventId eventId, TState state, Except
3842
return;
3943
}
4044

41-
ISpan span = _tracer.ActiveSpan;
45+
ITracer tracer = _globalTracerAccessor.GetGlobalTracer();
46+
ISpan span = tracer.ActiveSpan;
4247

4348
if (span == null)
4449
{

src/OpenTracing.Contrib.NetCore/Logging/OpenTracingLoggerProvider.cs

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -10,24 +10,17 @@ namespace OpenTracing.Contrib.NetCore.Logging
1010
[ProviderAlias("OpenTracing")]
1111
internal class OpenTracingLoggerProvider : ILoggerProvider
1212
{
13-
private readonly ITracer _tracer;
13+
private readonly IGlobalTracerAccessor _globalTracerAccessor;
1414

1515
public OpenTracingLoggerProvider(IGlobalTracerAccessor globalTracerAccessor)
1616
{
17-
// HACK: We can't use ITracer directly here because this would lead to a StackOverflowException
18-
// (due to a circular dependency) if the ITracer needs a ILoggerFactory.
19-
// https://github.com/opentracing-contrib/csharp-netcore/issues/14
20-
21-
if (globalTracerAccessor == null)
22-
throw new ArgumentNullException(nameof(globalTracerAccessor));
23-
24-
_tracer = globalTracerAccessor.GetGlobalTracer();
17+
_globalTracerAccessor = globalTracerAccessor ?? throw new ArgumentNullException(nameof(globalTracerAccessor));
2518
}
2619

2720
/// <inheritdoc/>
2821
public ILogger CreateLogger(string categoryName)
2922
{
30-
return new OpenTracingLogger(_tracer, categoryName);
23+
return new OpenTracingLogger(_globalTracerAccessor, categoryName);
3124
}
3225

3326
public void Dispose()

0 commit comments

Comments
 (0)