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

标签 c# .net logging log4net episerver

配置和使用log4net有两种方式。第一个是当我可以配置我自己的 appender 和关联的记录器时:

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

另一种使用它的方法是将根配置为我想要的详细信息:

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

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

关于c# - 使用 log4net 的正确方法(记录器命名),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7089286/

相关文章:

c# - 从文本文件中读取并更新

c# - 标准网络服务 (asmx) 是否与 MVC 一起工作?

c# - 检测哈希表或字典中的重新散列或冲突

java - 如何使用属性文件在 log4j.xml 中设置值?

logging - Fluentd 到 Logstash 输出插件

Python 日志记录级别似乎不起作用

c# - 有什么理由在字段上使用非常简单的属性吗?

c# - 使用设置文件时出错。

c# - 不可变类型的哈希码

c# - 在 WinRT 中处理控件上的水平滑动