正确的使用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时必须更改文件。
- 在项目中添加log2net.dll的引用。
- 的app.config
- 您将在其中实现日志的类文件。
在[ 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器。 对不起我的英语不好。