为什么记录器建议每个类使用一个记录器?

Dan*_* T. 86 c# logging log4net nlog

根据NLog的文档:

大多数应用程序将为每个类使用一个记录器,其中记录器的名称与类的名称相同.

这与log4net的运行方式相同.为什么这是一个好习惯?

Jer*_*ebe 57

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

比较以下内容:

每班记录

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

public void SomeMethod()
{
    _logger.DebugFormat("File not found: {0}", _filename);
}
Run Code Online (Sandbox Code Playgroud)

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

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

-- or --

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

使用第二个示例,Logger需要构建堆栈跟踪以查看谁正在调用它,或者您的代码始终必须传入调用者.使用每类记录器样式,您仍然可以执行此操作,但每个类可以执行一次,而不是每次调用一次,从而消除严重的性能问题.

  • @will,你能解释一下吗?当使用每个类的Logger进行日志记录时,我总是记录线程ID,以便记录器可以获取当前的线程信息.任何其他线程信息也可用于记录器. (7认同)

Cop*_*ick 15

在NLog中使用"每个文件记录器"的优点:您可以按命名空间和类名管理/过滤日志.例:

<logger name="A.NameSpace.MyClass"      minlevel="Debug" writeTo="ImportantLogs" /> 
<logger name="A.NameSpace.MyOtherClass" minlevel="Trace" writeTo="ImportantLogs" /> 
<logger name="StupidLibrary.*"          minlevel="Error" writeTo="StupidLibraryLogs" />

<!-- Hide other messages from StupidLibrary -->
<logger name="StupidLibrary.*" final="true" /> 

<!-- Log all but hidden messages -->
<logger name="*" writeTo="AllLogs" /> 
Run Code Online (Sandbox Code Playgroud)

NLogger有一个非常有用的代码片段来执行此操作.该nlogger代码段将创建以下代码:

private static NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger();
Run Code Online (Sandbox Code Playgroud)

所以只需要几次击键,每个类都有记录器.它将使用命名空间和类名作为记录器的名称.要为类记录器设置不同的名称,可以使用以下命令:

private static NLog.Logger logger = NLog.LogManager.GetLogger("MyLib.MyName");
Run Code Online (Sandbox Code Playgroud)

并且,正如@JeremyWiebe所说,你不必使用技巧来获取试图记录消息的类的名称:记录器的名称(通常是类的名称)可以很容易地记录到文件中(或其他目标)${logger}在布局中使用.


Pet*_*ore 5

我可以看到这个选择的几个原因.

  • 如果以日志输出格式包含记录器的名称,您将始终知道特定日志语句的来源.
  • 您可以通过打开或关闭某些记录器或设置其级别来控制您在细粒度级别上看到的日志语句.