NLog配置无法读取布尔属性,如何实现配置内布尔值校验?
如何在NLog配置中直接进行布尔值检查?
当然可以直接在NLog配置里做布尔值属性的检查,不需要转成字符串对比!你之前的问题出在条件表达式没有明确指定属性的类型解析规则,导致布尔值被默认序列化为字符串,没法直接做布尔比较。
正确的配置写法
你只需要在event-properties里加上:boolean=true参数,告诉NLog把这个属性值解析为布尔类型,就能直接进行布尔值对比了:
<logger name="*" minlevel="Error" writeTo="Database" > <filters> <!-- 明确指定解析为布尔值,直接对比false --> <when condition="${event-properties:item=LogToDatabase:boolean=true} == false" action="Ignore"/> </filters> </logger>
或者用更简洁的逻辑非写法:
<when condition="!${event-properties:item=LogToDatabase:boolean=true}" action="Ignore"/>
调用代码无需修改
你的原调用代码完全没问题,继续传入布尔值即可:
Log.Error().Message("test").Property("LogToDatabase", false).Write();
为什么原来的写法不生效?
原来的配置里${event-properties:item=LogToDatabase}默认会把属性值转成字符串,你传入的布尔false会被序列化为字符串"False"(注意首字母大写)。这时候你用== false对比,本质是字符串和布尔值的类型不匹配对比,自然不会生效。
而加上:boolean=true后,NLog会自动将属性值解析为布尔类型——不管你传入的是原生布尔值,还是字符串形式的"true"/"false"(大小写不敏感),都能正确识别并进行布尔判断。
另外还有一种更简洁的写法(效果和上面一致):
<when condition="${event-properties:LogToDatabase} != true" action="Ignore"/>
不过显式加上:boolean=true能避免类型歧义,让配置更清晰。
内容的提问来源于stack exchange,提问作者Kal
相关产品推荐
相关产品推荐

