创建自定义 log4net appender






4.78/5 (2投票s)
一个关于如何创建和实现自定义 log4net appender 的简短示例
引言
我最近的任务是想在代码的某个部分将事件记录到我们的内容管理系统中。我利用了 log4net,创建了一个自定义 appender,并且很快就成功地进行了记录。
我使用了 这个 详细的教程来更好地理解 log4net,并且我认为在阅读本文之前阅读它是一个先决条件。该文章的范围不包括自定义 appender,所以我尝试在这里给出一个示例。
使用代码
以下是包含 log4net 定义的 web.config 的部分。正如你所见,我有一个 logger 节点,它指示 ACM.Certification
命名空间中的所有代码都将使用 ACMAppender
appender 进行记录,最低记录级别为 INFO。在 logger 节点之上,我有我的 appender 定义节点,它标识了 appender 使用的类型 (ACM.ACMAppender
)。
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net" />
<log4net debug="false">
<appender name="ACMAppender" type="ACM.ACMAppender">
<layout type="log4net.Layout.PatternLayout,log4net">
<param name="ConversionPattern" value="%d{ABSOLUTE} %-5p %c{1}:%L - %m%n" />
</layout>
</appender>
<logger name="ACM.Certification" additivity="false">
<level value="INFO" />
<appender-ref ref="ACMAppender" />
</logger>
</log4net>
这是我的 ACMAppender
类,它简单地实现了抽象类 AppenderSkeleton
。它还使用了 RenderLoggingEvent()
辅助方法,该方法使用 web.config 上面定义的 ConversionPattern 将记录事件渲染为字符串。LogService
对象是我内容管理系统的自定义日志类。 你可以将
方法的内容替换为你希望在你的实现中使用的任何自定义日志记录。Append()
public class ACMAppender : AppenderSkeleton
{
protected override void Append(LoggingEvent loggingEvent)
{
LogLevel logLevel = LogLevel.Err;
switch (loggingEvent.Level.Name)
{
case "DEBUG":
logLevel = LogLevel.Debug;
break;
case "WARN":
case "INFO":
logLevel = LogLevel.Info;
break;
case "ERROR":
logLevel = LogLevel.Err;
break;
case "FATAL":
logLevel = LogLevel.Critical;
break;
}
LogService.Log(LogNameEnum.Exception, LogCategoryEnum.BusinessLogic, logLevel, RenderLoggingEvent(loggingEvent));
}
}
以下是在我的代码中使用它的示例。在实例化 ILog
对象之后,记录就像在对象上调用 Error()
(或你想要记录的任何类型的日志)方法一样简单。
public class Service : IHttpHandler
{
protected static readonly ILog log =
LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
public void ProcessRequest(HttpContext context)
{
try
{
//code
}
catch (Exception ex)
{
log.Error(ex);
}
}
}
希望这有帮助!