剑轩

nlog跳过微软的日志只显示我们自己的日志

电脑版发表于:2022/1/7 22:00


如果记录微软的日志会记录大量的日志信息,可能很多信息我们并不需要所以可以跳过,方法如下:

	<targets>
		<!--输出目标配置:配置Seq为输出类型-->
		<target name="seq" xsi:type="BufferingWrapper" bufferSize="1000" flushTimeout="2000"  >
			<target xsi:type="Seq" serverUrl="http://xx.yy.zz:8900" apiKey="apikey">
				<property name="ThreadId" value="${threadid}" as="number" />
				<property name="stacktrace" value="${onexception:inner=${stacktrace}}"/>
				<property name="Environment" value="Development" />
				<property name="IP" value="${aspnet-request-ip}" />
			</target>
		</target>

		<target xsi:type="Null" name="blackhole" />

	</targets>
	<rules>		
		<!--跳过微软的日志只显示我们自己的日志-->
		<logger name="Microsoft.*" minlevel="Trace" writeTo="blackhole" final="true" />
		<logger name="*" level="Debug,Warn,Information,Trace,Error,Fatal" writeTo="seq" />
	</rules>

我们在需要跳过微软日志的上方加上一个配置,name="Microsoft.*"表示名字以Microsoft开头的就会匹配到这个规则。并且加一个final="true",表示这是匹配到的最后一个规则,这些信息到这一步匹配到就会终止,不会在往下面去匹配了。

<logger name="Microsoft.*" minlevel="Trace" writeTo="blackhole" final="true" />

由于我们的writeTo="blackhole",而blackhole又没有设置输出。所以下面的记录就会跳过微软的日志,不会记录上。

其实原理相当于就是我们写了一个通配符把微软的信息单独写了一个规则,我们匹配到了但是又没有记录下来。他后面的就不会记录微软的日志了
当然它上面的还是会记录,如果写的是name="*",因为它上面的都会匹配到。

其实如果不想记录微软的日志上面的target都可以不要,我们直接在logger上面不写writeTo就行:

<logger name="Microsoft.*" minlevel="Trace" final="true" />
<logger name="*" level="Debug,Warn,Information,Trace,Error,Fatal" writeTo="seq" />

相当于就是加个final="true"就是分流,把微软输出的日志分流在这个规则里边,后面的就匹配不到了


当然我们如果只是不想把微软的日志记录到我们的核心日志查看的地方比如日志中心,我们还是可以把日志的日志单独记录到不重要的地方,比如单独写一个文件什么的,想到的时候也随时可以看,所以我们只记录微软报错信息这些重要的信息到日志中心。其他比如调试,info这些就记录到普通的文件里边即可。

比如我们只记录微软报错信息这些重要的信息到日志中心,可以这样配置
上面跳过微软error以下的日志即可,其他还是记录起,只需要上面的匹配最高等级是error一下的日志即可。这样一来error和error以上的还是可以在下面被匹配到,
被记录下来。

<logger name="Microsoft.*" maxlevel="Warning" final="true" />
<logger name="*" levels="Debug,Warn,Information,Trace,Error,Fatal" writeTo="seq" />


路由规则

<rules />区域定义了日志的路由规则。实际上它是一个简单的路由表,对每一个日志源/记录者的名称和记录等级的组合,定义了一个日志写入目标列表。 表中的规则是被顺序处理的。每当遇到匹配的规则时,日志信息就会被送到规则中定义的一个或多个目标去。如果一个规则被标识为最后一个,那么其后的规则都不会被执行。

每一个路由表项就是一个<logger />元素,它的可以接受的属性有:

name - 日志源/记录者的名字 (允许使用通配符*)

minlevel - 该规则所匹配日志范围的最低级别

maxlevel - 该规则所匹配日志范围的最高级别

level - 该规则所匹配的单一日志级别

levels - 该规则所匹配的一系列日志级别,由逗号分隔。

writeTo - 规则匹配时日志应该被写入的一系列目标,由逗号分隔。

final - 标记当前规则为最后一个规则。其后的规则即时匹配也不会被运行。

小例子:

<logger name="AJ.Space.Class1" minlevel="Debug" writeTo="f1" /> - 名字空间AJ.Space下的Class1这个类的所有级别等于或者高于Debug的日志信息都写入到“f1”这个目标里。

<logger name="AJ.Space.Class1" levels="Debug,Error" writeTo="f1" /> -名字空间AJ.Space下的Class1这个类的所有级别等于Debug或Error的日志信息都写入到“f1”这个目标里。

<logger name="AJ.Space.*" writeTo="f3,f4" /> -名字空间AJ.Space下所有类的所有级别的日志信息都写入到“f3”和“f4”这两个目标里。

<logger name="AJ.Space.*" minlevel="Debug" maxlevel="Error" final="true" /> - 名字空间AJ.Space下所有类的、级别在Debug和Error之间的(包括Debug,Info,Warn,Error) 日志信息都不会被记录(因为这条规则没有定义writeTo),同时其它后续规则也都会被忽略(因为这里设置了final="true")。


关于TNBLOG
TNBLOG,技术分享。技术交流:群号677373950
ICP备案 :渝ICP备18016597号-1
App store Android
精彩评论
{{item.replyName}}
{{item.content}}
{{item.time}}
{{subpj.replyName}}
@{{subpj.beReplyName}}{{subpj.content}}
{{subpj.time}}
猜你喜欢