@@ -13,11 +13,10 @@ The above copyright notice and this permission notice shall be included in all c
13
13
#region Imports
14
14
15
15
using System ;
16
- using System . Configuration ;
17
16
using System . IO ;
18
- using System . Xml ;
19
17
using NLog ;
20
18
using NLog . Config ;
19
+ using NLog . Targets ;
21
20
22
21
#endregion Imports
23
22
@@ -103,7 +102,7 @@ public class LoggerEvent
103
102
104
103
/// <summary>
105
104
/// ExchangeSharp logger. Will never throw exceptions.
106
- /// Currently the ExchangeSharp logger uses NLog internally, so make sure it is setup in your app.config file or nlog .config file.
105
+ /// Currently the ExchangeSharp logger uses NLog internally, so make sure it is setup in your app.config file or NLog .config file.
107
106
/// </summary>
108
107
public static class Logger
109
108
{
@@ -114,48 +113,54 @@ static Logger()
114
113
{
115
114
try
116
115
{
117
- LogFactory factory = null ;
118
- if (
119
- File . Exists (
120
- ConfigurationManager
121
- . OpenExeConfiguration ( ConfigurationUserLevel . None )
122
- . FilePath
123
- )
124
- )
116
+ // If configuration already provided by host, then keep it
117
+ var currentConfig = LogManager . Configuration ;
118
+ if ( currentConfig == null || currentConfig . AllTargets . Count == 0 )
125
119
{
126
- factory = LogManager . LoadConfiguration (
127
- ConfigurationManager
128
- . OpenExeConfiguration ( ConfigurationUserLevel . None )
129
- . FilePath
130
- ) ;
131
- }
120
+ // Try load from conventional files in application base directory
121
+ var baseDir = AppContext . BaseDirectory ;
122
+ string [ ] candidateFiles = new string [ ]
123
+ {
124
+ Path . Combine ( baseDir , "NLog.config" ) ,
125
+ Path . Combine ( baseDir , "nlog.config" )
126
+ } ;
132
127
133
- if ( factory == null || factory . Configuration . AllTargets . Count == 0 )
134
- {
135
- if ( File . Exists ( "nlog.config" ) )
128
+ string configPath = null ;
129
+ foreach ( var path in candidateFiles )
130
+ {
131
+ if ( File . Exists ( path ) )
132
+ {
133
+ configPath = path ;
134
+ break ;
135
+ }
136
+ }
137
+
138
+ if ( ! string . IsNullOrEmpty ( configPath ) )
136
139
{
137
- factory = LogManager . LoadConfiguration ( "nlog.config" ) ;
140
+ LogManager . Setup ( ) . LoadConfigurationFromFile ( configPath ) ;
138
141
}
139
142
else
140
143
{
141
- using var resourceStream =
142
- typeof ( Logger ) . Assembly . GetManifestResourceStream (
143
- "ExchangeSharp.nlog.config"
144
- ) ;
145
- System . Diagnostics . Debug . Assert (
146
- resourceStream != null ,
147
- nameof ( resourceStream ) + " != null"
148
- ) ;
149
- using var sr = new StreamReader ( resourceStream ) ;
150
- using var xr = XmlReader . Create ( sr ) ;
151
- LogManager . Configuration = new XmlLoggingConfiguration (
152
- xr ,
153
- Directory . GetCurrentDirectory ( )
154
- ) ;
155
- factory = LogManager . LogFactory ;
144
+ // Try load from embedded resource
145
+ using var resourceStream = typeof ( Logger ) . Assembly . GetManifestResourceStream ( "ExchangeSharp.nlog.config" ) ;
146
+ if ( resourceStream != null )
147
+ {
148
+ using var sr = new StreamReader ( resourceStream ) ;
149
+ var xml = sr . ReadToEnd ( ) ;
150
+ LogManager . Setup ( ) . LoadConfigurationFromXml ( xml ) ;
151
+ }
152
+ else
153
+ {
154
+ // Last resort: simple in-code configuration to console
155
+ var cfg = new LoggingConfiguration ( ) ;
156
+ var console = new ConsoleTarget ( "console" ) ;
157
+ cfg . AddRule ( NLog . LogLevel . Info , NLog . LogLevel . Fatal , console ) ;
158
+ LogManager . Configuration = cfg ;
159
+ }
156
160
}
157
161
}
158
- logger = factory . GetCurrentClassLogger ( ) ;
162
+
163
+ logger = LogManager . GetCurrentClassLogger ( ) ;
159
164
}
160
165
catch ( Exception ex )
161
166
{
@@ -164,58 +169,48 @@ static Logger()
164
169
}
165
170
}
166
171
167
- /// <summary>
168
- /// Map IPBan log level to NLog log level
169
- /// </summary>
170
- /// <param name="logLevel">IPBan log level</param>
171
- /// <returns>NLog log level</returns>
172
- public static NLog . LogLevel GetNLogLevel ( LogLevel logLevel )
173
- {
172
+ /// <summary>
173
+ /// Map IPBan log level to NLog log level
174
+ /// </summary>
175
+ /// <param name="logLevel">IPBan log level</param>
176
+ /// <returns>NLog log level</returns>
177
+ public static NLog . LogLevel GetNLogLevel ( LogLevel logLevel ) => logLevel switch
178
+ {
179
+ LogLevel . Critical => NLog . LogLevel . Fatal ,
180
+ LogLevel . Debug => NLog . LogLevel . Debug ,
181
+ LogLevel . Error => NLog . LogLevel . Error ,
182
+ LogLevel . Information => NLog . LogLevel . Info ,
183
+ LogLevel . Trace => NLog . LogLevel . Trace ,
184
+ LogLevel . Warning => NLog . LogLevel . Warn ,
185
+ _ => NLog . LogLevel . Off ,
186
+ } ;
187
+
188
+ /*
189
+ /// <summary>
190
+ /// Map Microsoft log level to NLog log level
191
+ /// </summary>
192
+ /// <param name="logLevel">Microsoft log level</param>
193
+ /// <returns>NLog log level</returns>
194
+ public static NLog.LogLevel GetNLogLevel(Microsoft.Extensions.Logging.LogLevel logLevel)
195
+ {
174
196
switch (logLevel)
175
197
{
176
- case LogLevel . Critical :
177
- return NLog . LogLevel . Fatal ;
178
- case LogLevel . Debug :
179
- return NLog . LogLevel . Debug ;
180
- case LogLevel . Error :
181
- return NLog . LogLevel . Error ;
182
- case LogLevel . Information :
183
- return NLog . LogLevel . Info ;
184
- case LogLevel . Trace :
185
- return NLog . LogLevel . Trace ;
186
- case LogLevel . Warning :
187
- return NLog . LogLevel . Warn ;
188
- default :
189
- return NLog . LogLevel . Off ;
198
+ case Microsoft.Extensions.Logging.LogLevel.Critical: return NLog.LogLevel.Fatal;
199
+ case Microsoft.Extensions.Logging.LogLevel.Debug: return NLog.LogLevel.Debug;
200
+ case Microsoft.Extensions.Logging.LogLevel.Error: return NLog.LogLevel.Error;
201
+ case Microsoft.Extensions.Logging.LogLevel.Information: return NLog.LogLevel.Info;
202
+ case Microsoft.Extensions.Logging.LogLevel.Trace: return NLog.LogLevel.Trace;
203
+ case Microsoft.Extensions.Logging.LogLevel.Warning: return NLog.LogLevel.Warn;
204
+ default: return NLog.LogLevel.Off;
190
205
}
191
- }
192
-
193
- /*
194
- /// <summary>
195
- /// Map Microsoft log level to NLog log level
196
- /// </summary>
197
- /// <param name="logLevel">Microsoft log level</param>
198
- /// <returns>NLog log level</returns>
199
- public static NLog.LogLevel GetNLogLevel(Microsoft.Extensions.Logging.LogLevel logLevel)
200
- {
201
- switch (logLevel)
202
- {
203
- case Microsoft.Extensions.Logging.LogLevel.Critical: return NLog.LogLevel.Fatal;
204
- case Microsoft.Extensions.Logging.LogLevel.Debug: return NLog.LogLevel.Debug;
205
- case Microsoft.Extensions.Logging.LogLevel.Error: return NLog.LogLevel.Error;
206
- case Microsoft.Extensions.Logging.LogLevel.Information: return NLog.LogLevel.Info;
207
- case Microsoft.Extensions.Logging.LogLevel.Trace: return NLog.LogLevel.Trace;
208
- case Microsoft.Extensions.Logging.LogLevel.Warning: return NLog.LogLevel.Warn;
209
- default: return NLog.LogLevel.Off;
210
- }
211
- }
212
- */
206
+ }
207
+ */
213
208
214
- /// <summary>
215
- /// Log an error
216
- /// </summary>
217
- /// <param name="ex">Error</param>
218
- public static void Error ( Exception ex )
209
+ /// <summary>
210
+ /// Log an error
211
+ /// </summary>
212
+ /// <param name="ex">Error</param>
213
+ public static void Error ( Exception ex )
219
214
{
220
215
Write ( LogLevel . Error , "Exception: " + ex . ToString ( ) ) ;
221
216
}
0 commit comments