NLog条件配置——实现将包含某个特定字符串日志写入指定文件
需求产生缘由
在开发中为了了解程序在运行的内存状态并记录下来,以便出问题时判断是不是与内存相关。于是实时采集了开发程序需要的内存信息。但采集的内存信息在存储时,以NLog中的Trace级别来存储的话,会与程序其它Trace级别的日志都记录在相同的Trace Log文件下,这会导致在查看内存日志时还需要将非内存日志去除,才能将所有的内存日志方便地显示出来。
解决方法——NLog XML配置Filters
代码如下,主要就是添加过滤条件filters,要实现的是含有MemoryLog的要写入Memory文件中,于是判断日志字符串中是否有MemoryLog.
<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="logconsole" xsi:type="Console" /> <target name="memory" xsi:type="File" fileName="${basedir}/Memory.log" layout="${longdate} ${level} ${message} ${exception} ${newline}" /> </targets> <rules> <logger name="*" minlevel="Info" writeTo="logconsole" /> <logger name="*" minlevel="Debug" writeTo="logfile" /> <logger name="*" minlevel="Trace" writeTo="memory" >
<filters defaultAction="Ignore"> <when condition="contains('${message}', 'MemoryLog')" action="Log" /> </filters>
</logger> </rules> </nlog>
注意:filters的defaultAction设置成Ignore(忽略),否则会将其它含有MemoryLog的日志记录到Memory文件中;另外xml配置时插入的xml文件文件名应该为NLog.config,同时要将此文件的 复制到输出目录 设置为 如果较新则复制/始终复制。
参考链接:
When Filter · NLog/NLog Wiki · GitHub
Filtering log messages · NLog/NLog Wiki · GitHub
解决方法——C#代码配置Filters
本质就是将上述xml转化为C#代码 ,为了方便以后查阅,特记录如下:
var config = new NLog.Config.LoggingConfiguration(); //设定log文件 var logfile = new NLog.Targets.FileTarget("logfile") { FileName = "file.txt" }; //设定log控制台 var logconsole = new NLog.Targets.ConsoleTarget("logconsole"); //设定MemoryLog文件 var memory = new NLog.Targets.FileTarget("memory") { FileName = "${basedir}/Memory.log", Layout = "${longdate} ${level} ${message} ${exception} ${newline}" }; config.AddRule(NLog.LogLevel.Info, NLog.LogLevel.Fatal, logconsole); config.AddRule(NLog.LogLevel.Debug, NLog.LogLevel.Fatal, logfile); //为memory设定过滤条件 var rule = new NLog.Config.LoggingRule("*", NLog.LogLevel.Trace, memory); rule.Filters.Add(new NLog.Filters.ConditionBasedFilter { Condition = "contains('${message}', 'MemoryLog')", Action = NLog.Filters.FilterResult.Log }); config.LoggingRules.Add(rule); NLog.LogManager.Configuration = config;
*****有道无术,术尚可求;有术无道,止于术。*****