正确使用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?系统的每个部分都在自己的日志记录器中写入,或者所有内容都在默认的日志记录器中写入,然后由配置决定下一步该做什么?

正确使用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。


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

(应用程序内。配置:

首先,在'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的每个类中使用同一行代码,而不必在复制和粘贴时记住更改代码。或者,我可以创建一个日志类,并让所有其他类从我的日志类继承。

第二种方法的缺点是存储库很大,并且创建了日志记录器。如果定义了根而没有定义类日志记录器,这个日志记录器也会这样做。生产系统的标准场景是使用专用于类组的少数记录器。对不起,我的英语不好。