首页 文章

正确使用log4net的方法( Logger 命名)

提问于
浏览
74

有两种配置和使用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>

然后,当我想在日志中写一些东西时,我可以执行以下操作:

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?系统的每个部分都在自己的 Logger 中写入,或者所有内容都是用默认 Logger 编写的,配置决定下一步做什么?

4 回答

  • 0

    关于如何在代码中记录消息,我会选择第二种方法:

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

    使用完全限定类型 Bar 发送到上述日志的邮件将是'named',例如

    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和您自己的代码指定不同的日志记录级别 .

    为了进一步阅读,这是我在日志记录中写的代码项目文章:

  • 8

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

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


    • 在项目中添加log4net.dll的引用 .

    • app.config

    • 用于实现日志的类文件 .

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

    Inside Calling Class :

    在您要使用此log4net的类中,您需要声明下面的代码段 .

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

    现在,您可以在同一个类中随时随地调用日志 . 下面是您在执行操作时可以调用的方法之一 .

    log.Error("message");
    
  • 89

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

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

    通过这种方式,我可以在每个使用log4net的类中使用相同的代码行,而无需记住在复制和粘贴时更改代码 . 或者,我可以创建一个日志记录类,并让其他所有类继承我的日志记录类 .

  • 4

    第二种方法的缺点是使用创建的 Logger 的大型存储库 . 如果定义了root并且未定义类 Logger ,则此 Logger 将执行相同操作 . 生产环境 系统的标准方案是使用专用于类组的少量 Logger . 对不起我的英语不好 .

相关问题