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需要构建堆栈跟踪以查看谁正在调用它,或者您的代码始终必须传入调用者.使用每类记录器样式,您仍然可以执行此操作,但每个类可以执行一次,而不是每次调用一次,从而消除严重的性能问题.
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}
在布局中使用.
我可以看到这个选择的几个原因.