1
1
using Microsoft . Extensions . Logging ;
2
2
using Microsoft . VisualStudio . DebuggerVisualizers ;
3
3
using System ;
4
+ using System . Collections ;
4
5
using System . IO ;
5
6
using System . Reflection ;
6
7
@@ -10,7 +11,58 @@ public class LoggerObjectSource : VisualizerObjectSource
10
11
{
11
12
public override void GetData ( object target , Stream outgoingData )
12
13
{
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 < > ) )
14
66
{
15
67
var logger = GetPrivateField ( target , "_logger" ) as ILogger ;
16
68
if ( logger ? . GetType ( ) . FullName != "Microsoft.Extensions.Logging.Logger" ) return ;
@@ -53,29 +105,17 @@ public override void GetData(object target, Stream outgoingData)
53
105
case "Microsoft.Extensions.Logging.Console.ConsoleLoggerProvider" :
54
106
{
55
107
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 ) ;
63
109
break ;
64
110
}
65
111
case "Microsoft.Extensions.Logging.EventLog.EventLogLoggerProvider" :
66
112
{
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 ) ;
71
114
break ;
72
115
}
73
116
case "Elmah.Io.Extensions.Logging.ElmahIoLoggerProvider" :
74
117
{
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 ) ;
79
119
break ;
80
120
}
81
121
}
@@ -87,6 +127,36 @@ public override void GetData(object target, Stream outgoingData)
87
127
}
88
128
}
89
129
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
+
90
160
static object FirstOrNull ( Array messageLoggers , ILogger logger )
91
161
{
92
162
if ( messageLoggers is null || messageLoggers . Length == 0 )
@@ -165,5 +235,14 @@ private static object GetPrivateField(object obj, string name)
165
235
return theValue ;
166
236
}
167
237
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
+
168
247
}
169
248
}
0 commit comments