@@ -28,15 +28,13 @@ public void Dispose()
28
28
29
29
private sealed class TelemetryLogger : ILogger
30
30
{
31
- private readonly DashboardTelemetryService ? _telemetryService ;
31
+ private readonly IServiceProvider _serviceProvider ;
32
+ private readonly bool _isCircuitHostLogger ;
32
33
33
34
public TelemetryLogger ( IServiceProvider serviceProvider , string categoryName )
34
35
{
35
- if ( categoryName == CircuitHostLogCategory )
36
- {
37
- // Set this lazily to avoid a circular reference between resolving telemetry service and logging.
38
- _telemetryService = serviceProvider . GetRequiredService < DashboardTelemetryService > ( ) ;
39
- }
36
+ _serviceProvider = serviceProvider ;
37
+ _isCircuitHostLogger = categoryName == CircuitHostLogCategory ;
40
38
}
41
39
42
40
public IDisposable ? BeginScope < TState > ( TState state ) where TState : notnull => null ;
@@ -45,19 +43,30 @@ public TelemetryLogger(IServiceProvider serviceProvider, string categoryName)
45
43
46
44
public void Log < TState > ( LogLevel logLevel , EventId eventId , TState state , Exception ? exception , Func < TState , Exception ? , string > formatter )
47
45
{
48
- if ( _telemetryService != null && eventId == CircuitUnhandledExceptionEventId && exception != null )
46
+ if ( _isCircuitHostLogger && eventId == CircuitUnhandledExceptionEventId && exception != null )
49
47
{
50
- _telemetryService . PostFault (
51
- TelemetryEventKeys . Error ,
52
- $ "{ exception . GetType ( ) . FullName } : { exception . Message } ",
53
- FaultSeverity . Critical ,
54
- new Dictionary < string , AspireTelemetryProperty >
55
- {
56
- [ TelemetryPropertyKeys . ExceptionType ] = new AspireTelemetryProperty ( exception . GetType ( ) . FullName ! ) ,
57
- [ TelemetryPropertyKeys . ExceptionMessage ] = new AspireTelemetryProperty ( exception . Message ) ,
58
- [ TelemetryPropertyKeys . ExceptionStackTrace ] = new AspireTelemetryProperty ( exception . StackTrace ?? string . Empty )
59
- }
60
- ) ;
48
+ try
49
+ {
50
+ // Get the telemetry service lazily to avoid a circular reference between resolving telemetry service and logging.
51
+ var telemetryService = _serviceProvider . GetRequiredService < DashboardTelemetryService > ( ) ;
52
+
53
+ telemetryService . PostFault (
54
+ TelemetryEventKeys . Error ,
55
+ $ "{ exception . GetType ( ) . FullName } : { exception . Message } ",
56
+ FaultSeverity . Critical ,
57
+ new Dictionary < string , AspireTelemetryProperty >
58
+ {
59
+ [ TelemetryPropertyKeys . ExceptionType ] = new AspireTelemetryProperty ( exception . GetType ( ) . FullName ! ) ,
60
+ [ TelemetryPropertyKeys . ExceptionMessage ] = new AspireTelemetryProperty ( exception . Message ) ,
61
+ [ TelemetryPropertyKeys . ExceptionStackTrace ] = new AspireTelemetryProperty ( exception . StackTrace ?? string . Empty )
62
+ }
63
+ ) ;
64
+ }
65
+ catch
66
+ {
67
+ // We should never throw an error out of logging.
68
+ // Logging the error to telemetry shouldn't throw. But, for extra safety, send error to telemetry is inside a try/catch.
69
+ }
61
70
}
62
71
}
63
72
}
0 commit comments