安装NLog
NLog 的源代码托管在Github 上,一般的人直接使用NuGet就可以了。
这里我们选择安装NLog.Config。当然最方便的还是直接使用命令行:
Install-Package NLog.Config
Logger
Logger是最常用的类,推荐每个class都创建一个私有的静态实例。
class Program
{
private static Logger logger = LogManager.GetCurrentClassLogger();
static void Main(string[] args)
{
}
}
上面的代码将会以类名作为Logger实例的名字。等同于下面的方式:
Logger logger = LogManager.GetLogger("Program");
当然,logger是线程安全的。
Log levels
这里不是简单的枚举实现。
日志使用
logger.Trace("Sample trace message");
logger.Debug("Sample debug message");
logger.Info("Sample informational message");
logger.Warn("Sample warning message");
logger.Error("Sample error message");
logger.Fatal("Sample fatal error message");
logger.Log(LogLevel.Info, "Sample informational message");
int k = 42;
int l = 100;
logger.Trace("Sample trace message, k={0}, l={1}", k, l);
logger.Debug("Sample debug message, k={0}, l={1}", k, l);
logger.Info("Sample informational message, k={0}, l={1}", k, l);
logger.Warn("Sample warning message, k={0}, l={1}", k, l);
logger.Error("Sample error message, k={0}, l={1}", k, l);
logger.Fatal("Sample fatal error message, k={0}, l={1}", k, l);
logger.Log(LogLevel.Info, "Sample informational message, k={0}, l={1}", k, l);
由于性能原因,这里推荐使用logger自带的参数化格式字符串,而不是自己手动去拼接(string.format或者concat)。具体原因是因为格式化字符串会有性能损失,nlog 内部会延迟格式化字符串。只有当真正需要输出字符串的时候才去做。某些配置可以忽略日志的情况下,可以省去格式字符串的性能损耗。
Configuration
最简单的配置:
<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<targets>
<target name="logfile" xsi:type="File" fileName="file.txt" />
</targets>
<rules>
<logger name="*" minlevel="Info" writeTo="logfile" />
</rules>
</nlog>
设置多个Targets
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<targets>
<target name="logfile" xsi:type="File" fileName="file.txt" />
<target name="console" xsi:type="Console" />
</targets>
<rules>
<logger name="*" minlevel="Trace" writeTo="logfile" />
<logger name="*" minlevel="Info" writeTo="console" />
</rules>
</nlog>
指定logger name
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<targets>
<target name="logfile" xsi:type="File" fileName="file.txt" />
</targets>
<rules>
<logger name="SomeNamespace.Component.*" minlevel="Trace" writeTo="logfile" final="true" />
<logger name="*" minlevel="Info" writeTo="logfile" />
</rules>
</nlog>
Layouts
<target name="logfile" xsi:type="File" fileName="file.txt" layout="${date:format=yyyyMMddHHmmss} ${message}" />
Layout 分为简单的和格式化的。简单的Layout 如上所示就是定制输出的string 格式,结构化的Layout可以输出XML,CSV...
Wrappers
Wrappers 本身不做任何log的事情,只是修改logger 的行为。
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<targets>
<target name="asyncFile" xsi:type="AsyncWrapper">
<target name="logfile" xsi:type="File" fileName="file.txt" />
</target>
</targets>
<rules>
<logger name="*" minlevel="Info" writeTo="asyncFile" />
</rules>
</nlog>
一般常用的是AsyncWrapper,FilteringWrapper,需要更多的Wrappers点这里
つづく