NLog 的源代码托管在Github 上,一般的人直接使用NuGet就可以了。
这里我们选择安装NLog.Config。当然最方便的还是直接使用命令行:
Install-Package NLog.Config
Logger是最常用的类,推荐每个class都创建一个私有的静态实例。
class Program { private static Logger logger = LogManager.GetCurrentClassLogger(); static void Main(string[] args) { } }
上面的代码将会以类名作为Logger实例的名字。等同于下面的方式:
Logger logger = LogManager.GetLogger("Program");
当然,logger是线程安全的。
这里不是简单的枚举实现。
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 内部会延迟格式化字符串。只有当真正需要输出字符串的时候才去做。某些配置可以忽略日志的情况下,可以省去格式字符串的性能损耗。
最简单的配置:
<?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>
<target name="logfile" xsi:type="File" fileName="file.txt" layout="${date:format=yyyyMMddHHmmss} ${message}" />
Layout 分为简单的和格式化的。简单的Layout 如上所示就是定制输出的string 格式,结构化的Layout可以输出XML,CSV...
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点 这里
つづく