Skip to content

Commit d1bbba8

Browse files
authored
fix and modernize NLog in Logger (#876)
1 parent 2261504 commit d1bbba8

File tree

1 file changed

+80
-85
lines changed

1 file changed

+80
-85
lines changed

src/ExchangeSharp/Utility/Logger.cs

Lines changed: 80 additions & 85 deletions
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,10 @@ The above copyright notice and this permission notice shall be included in all c
1313
#region Imports
1414

1515
using System;
16-
using System.Configuration;
1716
using System.IO;
18-
using System.Xml;
1917
using NLog;
2018
using 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

Comments
 (0)