NLog条件配置——实现将包含某个特定字符串日志写入指定文件

需求产生缘由

在开发中为了了解程序在运行的内存状态并记录下来,以便出问题时判断是不是与内存相关。于是实时采集了开发程序需要的内存信息。但采集的内存信息在存储时,以NLog中的Trace级别来存储的话,会与程序其它Trace级别的日志都记录在相同的Trace Log文件下,这会导致在查看内存日志时还需要将非内存日志去除,才能将所有的内存日志方便地显示出来。

解决方法——NLog XML配置

代码如下,主要就是添加过滤条件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(忽略),否则会将其它日志记录到Memory文件中;另外xml配置时插入的xml文件文件名应该为NLog.config,同时要将此文件的 复制到输出目录 设置为 如果较新则复制/始终复制。
<when condition="!contains('${message}', 'MemoryLog')" action="Ignore" /> 这则是包含了MemoryLog就不写入的条件写法。

为了不让MemoryLog同时写入Trace文件中,就需要在Trace的Filter中如下操作:

	<logger name="*" minlevel="Trace" writeTo="trace" >
		<filters>
			<when condition="!contains('${message}', 'MemoryLog')" action="Ignore" />
		</filters>
	</logger>
 

解决方法——C#代码

本质就是将上述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;

参考链接

When Filter · NLog/NLog Wiki · GitHub

Filtering log messages · NLog/NLog Wiki · GitHub

  • 8
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值