@@ -13,11 +13,10 @@ The above copyright notice and this permission notice shall be included in all c
1313#region Imports
1414
1515using System ;
16- using System . Configuration ;
1716using System . IO ;
18- using System . Xml ;
1917using NLog ;
2018using NLog . Config ;
19+ using NLog . Targets ;
2120
2221#endregion Imports
2322
@@ -103,7 +102,7 @@ public class LoggerEvent
103102
104103 /// <summary>
105104 /// 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.
107106 /// </summary>
108107 public static class Logger
109108 {
@@ -114,48 +113,54 @@ static Logger()
114113 {
115114 try
116115 {
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 )
125119 {
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+ } ;
132127
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 ) )
136139 {
137- factory = LogManager . LoadConfiguration ( "nlog.config" ) ;
140+ LogManager . Setup ( ) . LoadConfigurationFromFile ( configPath ) ;
138141 }
139142 else
140143 {
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+ }
156160 }
157161 }
158- logger = factory . GetCurrentClassLogger ( ) ;
162+
163+ logger = LogManager . GetCurrentClassLogger ( ) ;
159164 }
160165 catch ( Exception ex )
161166 {
@@ -164,58 +169,48 @@ static Logger()
164169 }
165170 }
166171
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+ {
174196 switch (logLevel)
175197 {
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;
190205 }
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+ */
213208
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 )
219214 {
220215 Write ( LogLevel . Error , "Exception: " + ex . ToString ( ) ) ;
221216 }
0 commit comments