正确使用log4net的方法(记录器命名)
本文关键字:记录器 方法 log4net | 更新日期: 2023-09-27 18:05:54
有两种配置和使用log4net的方法。第一个是当我可以配置自己的appender和关联的logger时:
<!-- 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>
然后当我想用log写东西时,我可以这样做:
ILog log = LogManager.GetLogger("myLog");
log.Info("message");
另一种使用它的方法是将root配置为我想要的详细:
<!-- language: xml -->
<root>
<level value="Error" />
<appender-ref ref="myLogAppender" />
</root>
在这种情况下,我可以像这样记录消息:
ILog log = LogManager.GetLogger(typeof(Bar));
log.Info("message");
第二种方法的好处是您可以动态地启用或禁用一些消息。但问题是,我正在开发的EPiServer CMS,它有自己的日志系统,使用log4net,如果我启用信息日志在根级,那么很多系统日志将被写入。
如何使用log4net?系统的每个部分都在自己的日志记录器中写入,或者所有内容都在默认的日志记录器中写入,然后由配置决定下一步该做什么?
关于如何在代码中记录消息,我会选择第二种方法:
ILog log = LogManager.GetLogger(typeof(Bar));
log.Info("message");
发送到上述日志的消息将使用完全限定类型Bar
进行"命名",例如
MyNamespace.Foo.Bar [INFO] message
这种方法的优点是它是组织日志的事实上的标准,它还允许您按名称空间过滤日志消息。例如,您可以指定要记录INFO级别的消息,但是将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>
通过名称过滤日志的能力是log4net的一个强大功能,如果你只是将所有的消息记录到"myLog"
,你就失去了很多这种能力!
对于EPiServer CMS,您应该能够使用上述方法为CMS和您自己的代码指定不同的日志级别。
为了进一步阅读,这里是我写的一篇关于日志的代码项目文章:
- 记录的艺术
我的答案可能来得晚了,但我想它可以帮助新手。除非按照以下方式进行更改,否则不会看到日志被执行。
2文件必须更改,当你实现Log4net。
- 在项目中增加log4net.dll的引用。
- 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");
现在,您已经准备好在同一个类中想要的任何地方调用日志。下面是一个可以在执行操作时调用的方法。
log.Error("message");
我没有命名调用类,而是开始使用以下方式:
private static readonly ILog log = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
通过这种方式,我可以在使用log4net的每个类中使用同一行代码,而不必在复制和粘贴时记住更改代码。或者,我可以创建一个日志类,并让所有其他类从我的日志类继承。
第二种方法的缺点是存储库很大,并且创建了日志记录器。如果定义了根而没有定义类日志记录器,这个日志记录器也会这样做。生产系统的标准场景是使用专用于类组的少数记录器。对不起,我的英语不好。