创建自定义log4net附加组件

分享于 

3分钟阅读

Web开发

  繁體 雙語

介绍

在最近的任务中,我希望将代码部分中的事件记录到内容管理系统中。 我利用了 log4net,创建了定制的附加程序,并且在没有时间。

在本文的详细介绍中,我使用了来更好地掌握,在阅读本文之前,我将考虑先阅读它。 自定义附加程序超出了本文的范围,所以我想我将尝试在这里给出一个示例。

使用代码

下面是我的Web.Config 和log4net定义的部分。 如你所见,我有一个记录器节点,它指示 ACM.Certification 命名空间中的所有代码都使用 ACMAppender的最小日志记录级别。 在logger节点之上,我有my定义节点,它标识了用于附加器的类型。

<sectionname="log4net"type="log4net.Config.Log4NetConfigurationSectionHandler,log4net"/><log4netdebug="false"><appendername="ACMAppender"type="ACM.ACMAppender"><layouttype="log4net.Layout.PatternLayout,log4net"><paramname="ConversionPattern"value="%d{ABSOLUTE} %-5p %c{1}:%L - %m%n"/></layout></appender><loggername="ACM.Certification"additivity="false"><levelvalue="INFO"/><appender-refref="ACMAppender"/></logger></log4net>

这是我的ACMAppender 类,它简单地实现了抽象类 AppenderSkeleton。 它还使用 RenderLoggingEvent() helper 方法将日志记录事件呈现为字符串,使用上面定义的Web.Config 中定义的ConversionPattern。 LogService 对象是我的内容管理系统的自定义日志记录类。 你将替换 <code>Append() 方法的内容,使用你希望实现的任何自定义日志记录。

publicclass ACMAppender : AppenderSkeleton
{
 protectedoverridevoid 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() ( 或者你想记录的任何类型的日志) 方法一样简单。

publicclass Service : IHttpHandler
{
 protectedstaticreadonly ILog log = 
 LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); 
 publicvoid ProcessRequest(HttpContext context)
 {
 try {
 //code }
 catch (Exception ex)
 {
 log.Error(ex);
 }
 }
}

希望有帮助!