11using Microsoft . Extensions . Logging ;
22using Microsoft . VisualStudio . DebuggerVisualizers ;
33using System ;
4+ using System . Collections ;
45using System . IO ;
56using System . Reflection ;
67
@@ -10,7 +11,58 @@ public class LoggerObjectSource : VisualizerObjectSource
1011 {
1112 public override void GetData ( object target , Stream outgoingData )
1213 {
13- if ( target . GetType ( ) . IsGenericType && target . GetType ( ) . GetGenericTypeDefinition ( ) == typeof ( Logger < > ) )
14+ if ( target . GetType ( ) == typeof ( LoggerFactory ) )
15+ {
16+ var field = GetPrivateField ( target , "_providerRegistrations" ) ;
17+ var result = new LoggerModel
18+ {
19+ Loggers = [ ]
20+ } ;
21+
22+ Type listType = field . GetType ( ) ;
23+ if ( typeof ( IEnumerable ) . IsAssignableFrom ( listType ) )
24+ {
25+ // Cast the value to IEnumerable to access the elements
26+ IEnumerable list = ( IEnumerable ) field ;
27+
28+ foreach ( var item in list )
29+ {
30+ var provider = GetPublicField ( item , "Provider" ) as ILoggerProvider ;
31+ var providerTypeValue = provider ? . GetType ( ) ;
32+
33+ Logger loggerModel = new ( )
34+ {
35+ Name = providerTypeValue ? . FullName ,
36+ } ;
37+
38+ switch ( provider ? . GetType ( ) . FullName )
39+ {
40+ case "Microsoft.Extensions.Logging.Console.ConsoleLoggerProvider" :
41+ {
42+ var optionsMonitor = GetPrivateField ( provider , "_options" ) ;
43+ var options = GetPublicProperty ( optionsMonitor , "CurrentValue" ) ;
44+ loggerModel = ConsoleOptions ( options , loggerModel ) ;
45+ break ;
46+ }
47+ case "Microsoft.Extensions.Logging.EventLog.EventLogLoggerProvider" :
48+ {
49+ loggerModel = EventLogSettings ( provider , loggerModel ) ;
50+ break ;
51+ }
52+ case "Elmah.Io.Extensions.Logging.ElmahIoLoggerProvider" :
53+ {
54+ loggerModel = ElmahIoOptions ( provider , loggerModel ) ;
55+ break ;
56+ }
57+ }
58+
59+ result . Loggers . Add ( loggerModel ) ;
60+ }
61+ }
62+
63+ SerializeAsJson ( outgoingData , result ) ;
64+ }
65+ else if ( target . GetType ( ) . IsGenericType && target . GetType ( ) . GetGenericTypeDefinition ( ) == typeof ( Logger < > ) )
1466 {
1567 var logger = GetPrivateField ( target , "_logger" ) as ILogger ;
1668 if ( logger ? . GetType ( ) . FullName != "Microsoft.Extensions.Logging.Logger" ) return ;
@@ -53,29 +105,17 @@ public override void GetData(object target, Stream outgoingData)
53105 case "Microsoft.Extensions.Logging.Console.ConsoleLoggerProvider" :
54106 {
55107 var options = GetNonPublicProperty ( internalLogger , "Options" ) ;
56- loggerModel . FormatterName = GetPublicProperty ( options , "FormatterName" ) ? . ToString ( ) ;
57- loggerModel . TimestampFormat = GetPublicProperty ( options , "TimestampFormat" ) ? . ToString ( ) ;
58- loggerModel . QueueFullMode = GetPublicProperty ( options , "QueueFullMode" ) ? . ToString ( ) ;
59- loggerModel . DisableColors = GetPublicProperty ( options , "DisableColors" ) ? . ToString ( ) ;
60- loggerModel . LogToStandardErrorThreshold = GetPublicProperty ( options , "LogToStandardErrorThreshold" ) ? . ToString ( ) ;
61- loggerModel . MaxQueueLength = GetPublicProperty ( options , "MaxQueueLength" ) ? . ToString ( ) ;
62- loggerModel . UseUtcTimestamp = GetPublicProperty ( options , "UseUtcTimestamp" ) ? . ToString ( ) ;
108+ loggerModel = ConsoleOptions ( options , loggerModel ) ;
63109 break ;
64110 }
65111 case "Microsoft.Extensions.Logging.EventLog.EventLogLoggerProvider" :
66112 {
67- var settings = GetPrivateField ( internalLogger , "_settings" ) ;
68- loggerModel . LogName = GetPublicProperty ( settings , "LogName" ) ? . ToString ( ) ;
69- loggerModel . MachineName = GetPublicProperty ( settings , "MachineName" ) ? . ToString ( ) ;
70- loggerModel . SourceName = GetPublicProperty ( settings , "SourceName" ) ? . ToString ( ) ;
113+ loggerModel = EventLogSettings ( internalLogger , loggerModel ) ;
71114 break ;
72115 }
73116 case "Elmah.Io.Extensions.Logging.ElmahIoLoggerProvider" :
74117 {
75- var options = GetPrivateField ( internalLogger , "_options" ) ;
76- loggerModel . ApiKey = GetPublicProperty ( options , "ApiKey" ) ? . ToString ( ) ;
77- var logId = GetPublicProperty ( options , "LogId" ) as Guid ? ;
78- loggerModel . LogId = logId == Guid . Empty ? "" : logId ? . ToString ( ) ;
118+ loggerModel = ElmahIoOptions ( internalLogger , loggerModel ) ;
79119 break ;
80120 }
81121 }
@@ -87,6 +127,36 @@ public override void GetData(object target, Stream outgoingData)
87127 }
88128 }
89129
130+ private Logger ElmahIoOptions ( object objWithOptions , Logger loggerModel )
131+ {
132+ var options = GetPrivateField ( objWithOptions , "_options" ) ;
133+ loggerModel . ApiKey = GetPublicProperty ( options , "ApiKey" ) ? . ToString ( ) ;
134+ var logId = GetPublicProperty ( options , "LogId" ) as Guid ? ;
135+ loggerModel . LogId = logId == Guid . Empty ? "" : logId ? . ToString ( ) ;
136+ return loggerModel ;
137+ }
138+
139+ private Logger EventLogSettings ( object objWithSettings , Logger loggerModel )
140+ {
141+ var settings = GetPrivateField ( objWithSettings , "_settings" ) ;
142+ loggerModel . LogName = GetPublicProperty ( settings , "LogName" ) ? . ToString ( ) ;
143+ loggerModel . MachineName = GetPublicProperty ( settings , "MachineName" ) ? . ToString ( ) ;
144+ loggerModel . SourceName = GetPublicProperty ( settings , "SourceName" ) ? . ToString ( ) ;
145+ return loggerModel ;
146+ }
147+
148+ private Logger ConsoleOptions ( object options , Logger loggerModel )
149+ {
150+ loggerModel . FormatterName = GetPublicProperty ( options , "FormatterName" ) ? . ToString ( ) ;
151+ loggerModel . TimestampFormat = GetPublicProperty ( options , "TimestampFormat" ) ? . ToString ( ) ;
152+ loggerModel . QueueFullMode = GetPublicProperty ( options , "QueueFullMode" ) ? . ToString ( ) ;
153+ loggerModel . DisableColors = GetPublicProperty ( options , "DisableColors" ) ? . ToString ( ) ;
154+ loggerModel . LogToStandardErrorThreshold = GetPublicProperty ( options , "LogToStandardErrorThreshold" ) ? . ToString ( ) ;
155+ loggerModel . MaxQueueLength = GetPublicProperty ( options , "MaxQueueLength" ) ? . ToString ( ) ;
156+ loggerModel . UseUtcTimestamp = GetPublicProperty ( options , "UseUtcTimestamp" ) ? . ToString ( ) ;
157+ return loggerModel ;
158+ }
159+
90160 static object FirstOrNull ( Array messageLoggers , ILogger logger )
91161 {
92162 if ( messageLoggers is null || messageLoggers . Length == 0 )
@@ -165,5 +235,14 @@ private static object GetPrivateField(object obj, string name)
165235 return theValue ;
166236 }
167237
238+ [ System . Diagnostics . CodeAnalysis . SuppressMessage ( "Major Code Smell" , "S3011:Reflection should not be used to increase accessibility of classes, methods, or fields" , Justification = "" ) ]
239+ private static object GetPublicField ( object obj , string name )
240+ {
241+ FieldInfo fieldInfo = obj . GetType ( ) . GetField ( name , BindingFlags . Public | BindingFlags . Instance ) ;
242+ if ( fieldInfo == null ) return null ;
243+ var theValue = fieldInfo . GetValue ( obj ) ;
244+ return theValue ;
245+ }
246+
168247 }
169248}
0 commit comments