@@ -16,8 +16,15 @@ internal sealed partial class LoggingEventListener : EventListener, IAsyncDispos
1616 private readonly ILogger _logger ;
1717 private readonly EventLevel _eventLevel = EventLevel . Informational ;
1818
19- [ GeneratedRegex ( "^\\ d{2}-[a-f0-9]{32}-[a-f0-9]{16}-\\ d{2}$" ) ]
19+ private const string TraceParentRegularExpressionString = "^\\ d{2}-[a-f0-9]{32}-[a-f0-9]{16}-\\ d{2}$" ;
20+ #if NET8_0_OR_GREATER
21+ [ GeneratedRegex ( TraceParentRegularExpressionString ) ]
2022 private static partial Regex TraceParentRegex ( ) ;
23+ #else
24+
25+ private static Regex _traceParentRegex = new Regex ( TraceParentRegularExpressionString ) ;
26+ private static Regex TraceParentRegex ( ) => _traceParentRegex ;
27+ #endif
2128
2229 public LoggingEventListener ( ILogger logger )
2330 {
@@ -44,7 +51,7 @@ public override void Dispose()
4451 }
4552
4653 public ValueTask DisposeAsync ( ) =>
47- _logger is IAsyncDisposable d ? d . DisposeAsync ( ) : ValueTask . CompletedTask ;
54+ _logger is IAsyncDisposable d ? d . DisposeAsync ( ) : default ;
4855
4956
5057 protected override void OnEventSourceCreated ( EventSource eventSource )
@@ -69,20 +76,20 @@ protected override void OnEventWritten(EventWrittenEventArgs eventData)
6976 // to a rented array and Span<char> if required.
7077 var builder = StringBuilderCache . Acquire ( ) ;
7178
72- var spanId = CreateLogMessage ( eventData , builder ) ;
79+ #if NETSTANDARD2_0 || NETFRAMEWORK
80+ var timestamp = DateTime . UtcNow ; //best effort in absense of real event timestamp
81+ var osThreadId = 0L ;
82+ #else
83+ var timestamp = eventData . TimeStamp ;
84+ var osThreadId = eventData . OSThreadId ;
85+ #endif
7386
74- try
75- {
76- // TODO - We can only get the OS thread ID from the args - Do we send that instead??
77- // As per this issue - https://github.com/dotnet/runtime/issues/13125 - OnEventWritten may be on a different thread
78- // so we can't use the Environment.CurrentManagedThreadId value here.
79- _logger . WriteLogLine ( null , - 1 , eventData . TimeStamp , GetLogLevel ( eventData ) , StringBuilderCache . GetStringAndRelease ( builder ) , spanId ) ;
80- }
81- catch ( Exception )
82- {
83- // TODO - We might want to block writing further events if we reach here as it's
84- // likely a file access issue
85- }
87+ var spanId = CreateLogMessage ( eventData , builder , osThreadId ) ;
88+
89+ // TODO - We can only get the OS thread ID from the args - Do we send that instead??
90+ // As per this issue - https://github.com/dotnet/runtime/issues/13125 - OnEventWritten may be on a different thread
91+ // so we can't use the Environment.CurrentManagedThreadId value here.
92+ _logger . WriteLogLine ( null , - 1 , timestamp , GetLogLevel ( eventData ) , StringBuilderCache . GetStringAndRelease ( builder ) , spanId ) ;
8693
8794 static LogLevel GetLogLevel ( EventWrittenEventArgs eventData ) =>
8895 eventData . Level switch
@@ -96,13 +103,13 @@ static LogLevel GetLogLevel(EventWrittenEventArgs eventData) =>
96103 _ => LogLevel . None
97104 } ;
98105
99- static string ? CreateLogMessage ( EventWrittenEventArgs eventData , StringBuilder builder )
106+ static string ? CreateLogMessage ( EventWrittenEventArgs eventData , StringBuilder builder , long threadId )
100107 {
101108 string ? spanId = null ;
102109
103110 if ( eventData . EventSource . Name . StartsWith ( OpenTelemetrySdkEventSourceNamePrefix ) && eventData . Message is not null )
104111 {
105- builder . Append ( $ "OTEL-SDK: [{ eventData . OSThreadId } ] ") ;
112+ builder . Append ( $ "OTEL-SDK: [{ threadId } ] ") ;
106113
107114 if ( eventData . Payload is null )
108115 {
0 commit comments