1
1
using System ;
2
+ using System . Linq ;
2
3
using System . Reflection ;
4
+ using Microsoft . Extensions . Configuration ;
3
5
using Microsoft . Extensions . Logging ;
4
6
using NLog . Common ;
5
7
using NLog . Config ;
6
8
7
9
namespace NLog . Extensions . Logging
8
10
{
9
11
/// <summary>
10
- /// Helpers for .NET Core
12
+ /// Helpers for configuring NLog for Microsoft Extension Logging (MEL)
11
13
/// </summary>
12
14
public static class ConfigureExtensions
13
15
{
14
16
/// <summary>
15
- /// Enable NLog as logging provider in .NET Core.
17
+ /// Enable NLog as logging provider for Microsoft Extension Logging
16
18
/// </summary>
17
19
/// <param name="factory"></param>
18
20
/// <returns>ILoggerFactory for chaining</returns>
19
21
public static ILoggerFactory AddNLog ( this ILoggerFactory factory )
20
22
{
21
- return AddNLog ( factory , null ) ;
23
+ return factory . AddNLog ( NLogProviderOptions . Default ) ;
22
24
}
23
25
24
26
/// <summary>
25
- /// Enable NLog as logging provider in .NET Core.
27
+ /// Enable NLog as logging provider for Microsoft Extension Logging
26
28
/// </summary>
27
29
/// <param name="factory"></param>
28
30
/// <param name="options">NLog options</param>
@@ -33,19 +35,45 @@ public static ILoggerFactory AddNLog(this ILoggerFactory factory, NLogProviderOp
33
35
return factory ;
34
36
}
35
37
38
+ /// <summary>
39
+ /// Enable NLog as logging provider for Microsoft Extension Logging
40
+ /// </summary>
41
+ /// <param name="factory"></param>
42
+ /// <param name="configuration"></param>
43
+ /// <returns>ILoggerFactory for chaining</returns>
44
+ public static ILoggerFactory AddNLog ( this ILoggerFactory factory , IConfiguration configuration )
45
+ {
46
+ var provider = CreateNLogProvider ( configuration ) ;
47
+ factory . AddProvider ( provider ) ;
48
+ return factory ;
49
+ }
50
+
36
51
#if ! NETCORE1_0
37
52
/// <summary>
38
- /// Enable NLog as logging provider in .NET Core.
53
+ /// Enable NLog as logging provider for Microsoft Extension Logging
39
54
/// </summary>
40
55
/// <param name="factory"></param>
41
56
/// <returns>ILoggerFactory for chaining</returns>
42
57
public static ILoggingBuilder AddNLog ( this ILoggingBuilder factory )
43
58
{
44
- return AddNLog ( factory , null ) ;
59
+ return factory . AddNLog ( NLogProviderOptions . Default ) ;
45
60
}
46
61
47
62
/// <summary>
48
- /// Enable NLog as logging provider in .NET Core.
63
+ /// Enable NLog as logging provider for Microsoft Extension Logging
64
+ /// </summary>
65
+ /// <param name="factory"></param>
66
+ /// <param name="configuration">Configuration</param>
67
+ /// <returns>ILoggerFactory for chaining</returns>
68
+ public static ILoggingBuilder AddNLog ( this ILoggingBuilder factory , IConfiguration configuration )
69
+ {
70
+ var provider = CreateNLogProvider ( configuration ) ;
71
+ factory . AddProvider ( provider ) ;
72
+ return factory ;
73
+ }
74
+
75
+ /// <summary>
76
+ /// Enable NLog as logging provider for Microsoft Extension Logging
49
77
/// </summary>
50
78
/// <param name="factory"></param>
51
79
/// <param name="options">NLog options</param>
@@ -83,5 +111,48 @@ public static LoggingConfiguration ConfigureNLog(this ILoggerFactory loggerFacto
83
111
LogManager . Configuration = config ;
84
112
return config ;
85
113
}
114
+
115
+ /// <summary>
116
+ /// Factory method for <see cref="NLogLoggerProvider"/>
117
+ /// </summary>
118
+ /// <param name="nlogProvider"></param>
119
+ /// <param name="configurationSection">Microsoft Extension Configuration</param>
120
+ /// <returns></returns>
121
+ public static NLogLoggerProvider Configure ( this NLogLoggerProvider nlogProvider , IConfigurationSection configurationSection )
122
+ {
123
+ if ( configurationSection == null )
124
+ return nlogProvider ;
125
+
126
+ var configProps = nlogProvider . Options . GetType ( ) . GetProperties ( BindingFlags . Instance | BindingFlags . Public ) . Where ( p => p . SetMethod ? . IsPublic == true ) . ToDictionary ( p => p . Name , StringComparer . OrdinalIgnoreCase ) ;
127
+ foreach ( var configValue in configurationSection . GetChildren ( ) )
128
+ {
129
+ if ( configProps . TryGetValue ( configValue . Key , out var propertyInfo ) )
130
+ {
131
+ try
132
+ {
133
+ var result = Convert . ChangeType ( configValue . Value , propertyInfo . PropertyType ) ;
134
+ propertyInfo . SetMethod . Invoke ( nlogProvider . Options , new [ ] { result } ) ;
135
+ }
136
+ catch ( Exception ex )
137
+ {
138
+ InternalLogger . Warn ( ex , "NLogProviderOptions: Property {0} could not be assigned value: {1}" , configValue . Key , configValue . Value ) ;
139
+ }
140
+ }
141
+ }
142
+
143
+ return nlogProvider ;
144
+ }
145
+
146
+ private static NLogLoggerProvider CreateNLogProvider ( IConfiguration configuration )
147
+ {
148
+ var provider = new NLogLoggerProvider ( new NLogProviderOptions ( ) ) ;
149
+ if ( configuration != null )
150
+ {
151
+ // TODO ConfigSettingLayoutRenderer.DefaultConfiguration = configuration;
152
+ provider . Configure ( configuration . GetSection ( "Logging:NLog" ) ) ;
153
+ }
154
+
155
+ return provider ;
156
+ }
86
157
}
87
158
}
0 commit comments