正确的使用log4net(logging器命名)

有两种configuration和使用log4net的方法。 首先是我可以configuration我自己的appender和关联的logging器:

<!-- language: xml --> <appender name="myLogAppender" type="log4net.Appender.RollingFileAppender" > <file value="Logs\myLog.log" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%date %level - %message%n" /> </layout> </appender> <logger name="myLog"> <level value="All"></level> <appender-ref ref="myLogAppender" /> </logger> 

然后当我想在日志中写一些东西时,我可以做到以下几点:

 ILog log = LogManager.GetLogger("myLog"); log.Info("message"); 

使用它的另一种方法是将rootconfiguration为尽可能详细:

 <!-- language: xml --> <root> <level value="Error" /> <appender-ref ref="myLogAppender" /> </root> 

在这种情况下,我可以logging这样的消息:

 ILog log = LogManager.GetLogger(typeof(Bar)); log.Info("message"); 

第二种方法的好处是可以在运行中启用或禁用某些消息。 但问题是我正在开发EPiServer CMS,它有自己的日志系统,使用log4net,如果我在根目录下启用信息日志logging,那么很多系统日志将被写入。

你如何使用log4net? 系统的每个部分都在自己的logging器中写入,或者每个部分都写入默认logging器,然后configuration决定下一步该怎么做?

关于如何在代码中logging消息,我会select第二种方法:

 ILog log = LogManager.GetLogger(typeof(Bar)); log.Info("message"); 

凡发送到上面的日志消息将使用完全合格的typesBar '命名',例如

 MyNamespace.Foo.Bar [INFO] message 

这种方法的优点是它是组织日志logging的事实上的标准,它也允许你通过命名空间来过滤你的日志消息。 例如,您可以指定要loggingINFO级别的消息,但特别将Bar的日志级别提高为DEBUG:

 <log4net> <!-- appenders go here --> <root> <level value="INFO" /> <appender-ref ref="myLogAppender" /> </root> <logger name="MyNamespace.Foo.Bar"> <level value="DEBUG" /> </logger> </log4net> 

通过名称过滤logging的能力是log4net的一个强大function,如果您只是将所有消息logging到"myLog" ,那么您就失去了这个function!

关于EPiServer CMS,您应该能够使用上述方法为CMS和您自己的代码指定不同的日志logging级别。

为了进一步阅读,下面是我在日志中写的一个codeproject文章:

  • 伐木的艺术

我的答案可能会迟到,但我认为它可以帮助新手。 除非进行如下更改,否则不会看到执行的日志。

2实施Log4net时必须更改文件。


  1. 在项目中添加log2net.dll的引用。
  2. 的app.config
  3. 您将在其中实现日志的文件。

在[ app.config ]里面:

首先,在“configSections”下,你需要添加下面的一段代码;

 <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" /> 

然后,在'configuration'区块下面,你需要写下一段代码(这段代码是根据我的需要定制的,但它的作用就像魅力一样)。

 <log4net debug="true"> <logger name="log"> <level value="All"></level> <appender-ref ref="RollingLogFileAppender" /> </logger> <appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender"> <file value="log.txt" /> <appendToFile value="true" /> <rollingStyle value="Composite" /> <maxSizeRollBackups value="1" /> <maximumFileSize value="1MB" /> <staticLogFileName value="true" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%date %C.%M [%line] %-5level - %message %newline %exception %newline" /> </layout> </appender> </log4net> 

内部呼叫类

在你要使用这个log4net的类中,你需要声明下面的一段代码。

  ILog log = LogManager.GetLogger("log"); 

现在,你已经准备好了在同一个class级里的任何你想要的通话logging。 以下是您在操作时可以调用的方法之一。

 log.Error("message"); 

我没有命名我的调用类,而是开始使用以下内容:

 private static readonly ILog log = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); 

这样,我可以在每个使用log4net的类中使用同一行代码,而不必在复制和粘贴时记住更改代码。 或者,我可以创build一个日志logging类,并从我的日志logging类inheritance每个其他的类。

第二种方法的缺点是创buildlogging器的大型存储库。 如果定义了root并且没有定义类logging器,这个logging器也是这样做的。 生产系统的标准scheme是使用less数专用于class级的logging器。 对不起我的英语不好。