我正在使用 NLog 在我的 EPiserver 应用程序中记录异常。我将此博客用作参考,我的应用程序没有记录任何内容。
我创建了一个 NLog 桥附加器类并配置了 EPiServerLog.config 和 NLog.config:
NLogBridgeAppender 类:
using System;
using System.Collections.Generic;
using log4net.Appender;
using log4net.Config;
using log4net.Core;
using NLog;
namespace Tietgen.Web.Business.Core
{
public class NLogBridgeAppender : AppenderSkeleton
{
Dictionary<string, Logger> _loggers = new Dictionary<string, Logger>();
readonly object _lockObject = new object();
public static void Initialize()
{
BasicConfigurator.Configure(new NLogBridgeAppender());
}
protected override void Append(LoggingEvent loggingEvent)
{
var nLogEvent = ToNLog(loggingEvent);
var nLogger = GetLogger(loggingEvent);
nLogger.Log(nLogEvent);
}
Logger GetLogger(LoggingEvent loggingEvent)
{
Logger nLogger;
if (_loggers.TryGetValue(loggingEvent.LoggerName, out nLogger))
{
return nLogger;
}
lock (_lockObject)
{
if (_loggers.TryGetValue(loggingEvent.LoggerName, out nLogger))
{
return nLogger;
}
nLogger = LogManager.GetLogger(loggingEvent.LoggerName);
_loggers = new Dictionary<string, Logger>(_loggers)
{
{ loggingEvent.LoggerName, nLogger }
};
}
return nLogger;
}
private static LogLevel ToNLogLevel(Level level)
{
LogLevel nLevel;
if (level == Level.Fatal) nLevel = LogLevel.Fatal;
else if (level == Level.Error) nLevel = LogLevel.Error;
else if (level == Level.Warn) nLevel = LogLevel.Warn;
else if (level == Level.Debug) nLevel = LogLevel.Debug;
else if (level == Level.Info) nLevel = LogLevel.Info;
else if (level == Level.Trace) nLevel = LogLevel.Trace;
else if (level == Level.Off) nLevel = LogLevel.Off;
else
{
var message = string.Format("Unsupported log level: {0}.", level);
throw new NotSupportedException(message);
}
return nLevel;
}
private static LogEventInfo ToNLog(LoggingEvent loggingEvent)
{
return new LogEventInfo
{
Exception = loggingEvent.ExceptionObject,
LoggerName = loggingEvent.LoggerName,
Message = Convert.ToString(loggingEvent.MessageObject),
Level = ToNLogLevel(loggingEvent.Level),
TimeStamp = loggingEvent.TimeStamp,
FormatProvider = null
};
}
}
}
NLog.config:
<!--
See https://github.com/nlog/nlog/wiki/Configuration-file
for information on customizing logging rules and outputs.
-->
<targets>
<target xdt:Transform="Insert" xsi:type="File" name="AllFile" fileName="${basedir}/Logs/All.${shortdate}.log" layout="[${longdate}][${uppercase:${level}}][${logger}] ${message} ${exception:format=ToString,StackTrace}" />
<target xdt:Transform="Insert" xsi:type="File" name="TietgenFile" fileName="${basedir}/Logs/Tietgen.Web.${shortdate}.log" layout="[${longdate}][${uppercase:${level}}][${logger}] ${message} ${exception:format=ToString,StackTrace}" />
</targets>
<rules>
<logger xdt:Transform="Insert" name="*" minlevel="Warn" writeTo="AllFile" />
<logger xdt:Transform="Insert" name="Tietgen.Web" writeTo="TietgenFile" minlevel="Warn" />
</rules>
EPiServerLog.config:
<appender xdt:Transform="Remove"
xdt:Locator="Match(name)"
name="errorFileLogAppender" />
<appender xdt:Transform="Remove"
xdt:Locator="Match(name)"
name="outputDebugStringAppender" />
<appender xdt:Transform="Insert"
xdt:Locator="Match(name)"
name="NLogBridgeAppender"
type="Tietgen.Web.Business.Core.NLogBridgeAppender, Tietgen.Web.Business.Core">
<encoding value="utf-8" />
<filter type="log4net.Filter.LoggerMatchFilter">
<loggerToMatch value="Tietgen.Web" />
<acceptOnMatch value="false" />
</filter>
</appender>
<logger xdt:Transform="Replace"
xdt:Locator="Match(name)"
name="EPiServer.Core.OptimisticCache"
additivity="false">
<level value="Error" />
<appender-ref ref="NLogBridgeAppender" />
</logger>
<logger xdt:Transform="Replace"
xdt:Locator="Match(name)"
name="EPiServer.Core.ContentProvider"
additivity="false">
<level value="Error" />
<appender-ref ref="NLogBridgeAppender" />
</logger>
<logger xdt:Transform="Replace"
xdt:Locator="Match(name)"
name="EPiServer.Data.Dynamic.Providers.DbDataStoreProvider"
additivity="false">
<level value="Error" />
<appender-ref ref="NLogBridgeAppender" />
</logger>
<logger xdt:Transform="Replace"
xdt:Locator="Match(name)"
name="EPiServer.Data.Providers.SqlDatabaseHandler"
additivity="false">
<level value="Error" />
<appender-ref ref="NLogBridgeAppender" />
</logger>
<logger xdt:Transform="Replace"
xdt:Locator="Match(name)"
name="EPiServer.Data.Providers.ConnectionContext"
additivity="false">
<level value="Error" />
<appender-ref ref="NLogBridgeAppender" />
</logger>
<root xdt:Transform="Replace">
<level value="Warn" />
<appender-ref ref="NLogBridgeAppender" />
</root>