繁体   English   中英

log4net的正确使用方法(记录器命名)

[英]Correct way of using log4net (logger naming)

有两种配置和使用 log4net 的方法。 第一个是我可以配置自己的附加程序和关联的记录器:

<!-- 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");

另一种使用它的方法是将 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 时必须更改文件。


  1. 在项目中添加log4net.dll的引用。
  2. 应用程序配置
  3. Class文件,您将在其中实现日志。

在 [ app.config ] 内:

首先,在“configSections”下,您需要添加以下代码;

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

然后,在“配置”块下,您需要在下面编写一段代码。(这段代码是根据我的需要定制的,但它就像魅力一样。)

<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>

内部调用 Class

在您将要使用此 log4net 的 class 内部,您需要声明以下代码。

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

现在,您可以在同一个 class 中的任何位置准备通话记录。 以下是您在执行操作时可以调用的方法之一。

log.Error("message");

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

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

这样,我可以在每个使用 log4net 的 class 中使用同一行代码,而无需记住在复制和粘贴时更改代码。 或者,我可以创建一个日志记录 class,并让所有其他 class 从我的日志记录 class 继承。

第二种方法的缺点是带有创建记录器的大型存储库。 如果定义了 root 并且未定义 class 记录器,则此记录器执行相同的操作。 生产系统的标准方案是使用少数专用于 class 组的记录器。 对不起我的英语不好。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM