c# - 为什么记录器建议每个类(class)使用一个记录器?

标签 c# log4net logging nlog

根据 NLog 的文档:

Most applications will use one logger per class, where the name of the logger is the same as the name of the class.

这与 log4net 的操作方式相同。为什么这是一个好习惯?

最佳答案

使用 log4net,每个类使用一个记录器可以很容易地捕获日志消息的来源(即写入日志的类)。如果您没有为每个类配备一个记录器,而是为整个应用程序配备一个记录器,则您需要求助于更多的反射技巧来了解日志消息的来源。

比较以下内容:

每个类的日志

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

public void SomeMethod()
{
    _logger.DebugFormat("File not found: {0}", _filename);
}

每个应用程序(或类似应用程序)一个记录器

Logger.DebugFormat("File not found: {0}", _filename); // Logger determines caller

-- or --

Logger.DebugFormat(this, "File not found: {0}", _filename); // Pass in the caller

使用第二个示例,Logger 需要构建一个堆栈跟踪以查看谁在调用它,否则您的代码将始终必须传入调用者。使用 logger-per-class 风格,你仍然这样做,但你可以为每个类做一次而不是每次调用一次,并消除严重的性能问题。

关于c# - 为什么记录器建议每个类(class)使用一个记录器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3143929/

相关文章:

java - 重命名日志文件程序[初学者]

c# - SpeechSynthesizer 中的持续内存泄漏

c# - 检查列表是否包含多个指定值

c# - .net 成员(member)提供商使用什么加密算法?

log4net - 使用多个配置文件进行配置

c# - 如何在另存为文本文件时向 Log4Net 添加参数

c# - 如何在组合框中使用 case 作为字符串来执行 switch 语句?

.net - Log4Net:在 RollingFileAppender 上设置滚动日期的最大备份文件数

c++ - 如何在单元测试中测试 boost 记录器输出?

python - 自动将 Flask 的消息记录到记录器