【问题标题】:How to filter using a condition in NLog with C#如何使用 C# 在 NLog 中使用条件进行过滤
【发布时间】:2019-08-28 06:21:46
【问题描述】:

我在 C# 中创建 NLog 目标过滤器时遇到问题。我正在尝试创建一个过滤器来记录到两个不同的目标。我有一个基于包含匹配字符串的消息内容的条件。问题是我似乎无法让条件与机器名或事件上下文内容一起使用。

这将在使用消息本身时按预期工作:

var newRule = new LoggingRule("*", logLevel, someWrapper);
newRule.DefaultFilterResult = FilterResult.Ignore;
newRule.Filters.Add(new ConditionBasedFilter()
{
    Condition = "contains(message, 'string')",
    Action = FilterResult.Log
});
config.LoggingRules.Add(newRule);

这些不起作用:

Condition = "contains(machinename, 'string')"
Condition = "equals(machinename, 'string')"
Condition = "machinename == 'string')"
Condition = "contains(event-context:item=SomeItem, 'string')"
Condition = "equals(event-context:item=SomeItem, 'string')"
Condition = "event-context:item=SomeItem == 'string')"

我将看到的错误是:

“意外的令牌:==”或“意外的toekn:”

我不确定我的格式是否错误?我尝试了几种不同的选项,但似乎无法让条件过滤器与机器名或更具体地与事件上下文一起使用。

感谢您的宝贵时间和帮助!

【问题讨论】:

标签: c# filtering conditional-statements nlog


【解决方案1】:

你的条件缺少的是一些单引号。

var stringToCompare = "sometext";
var stringCondition = "'${machinename}' == '" + stringToCompare + "'";

...

newRule.Filters.Add(new ConditionBasedFilter()
{
    Condition = stringCondition,
    Action = FilterResult.Log
});

【讨论】:

  • 这会编译,但是比较“machinename”和“string”有什么用呢?我想我们正在寻找${machinename}。看我的回答
  • 你是对的,它应该使用${...},但是你的答案仍然没有正确执行,因为这个"${machinename} == 'string'"条件仍然会抛出一个异常:Invalid punctuation: $。我会更新我的答案以匹配this similar issue
【解决方案2】:

NLog 4.6.7 引入了新的NLog.Filters.WhenMethodFilter,它将 lambda 作为输入参数。

如果你想在不使用 NLog LayoutRenderers 的情况下进行过滤。另见:https://github.com/NLog/NLog/wiki/Filtering-log-messages

【讨论】:

    【解决方案3】:

    在某些情况下您可以使用布局渲染器,但您需要 ${...} 语法,

    这样就可以了:

    Condition = "contains(${machinename}, 'string')"
    Condition = "equals(${machinename}, 'string')"
    Condition = "${machinename} == 'string'"
    Condition = "contains(${event-context:item=SomeItem}, 'string')"
    Condition = "equals(${event-context:item=SomeItem}, 'string')"
    Condition = "${event-context:item=SomeItem} == 'string'"
    

    另见docs of the conditions in NLog

    条件语言 过滤器表达式是用一种特殊的迷你语言编写的。语言包括:

    • 关系运算符:==、!=、= 和 >
      • 注意:某些预定义的 XML 字符可能需要转义。例如,如果您尝试使用“
    • 布尔运算符:and、or、not
    • 始终作为布局评估的字符串文字 - ${somerenderer}
    • 布尔文字 - 真假
    • 数字文字 - 例如12345(整数文字)和 12345.678(浮点文字)
    • 日志级别文字 - LogLevel.Trace、LogLevel.Debug、... LogLevel.Fatal
    • 预定义关键字来访问最常见的日志事件属性 - 级别、消息和记录器
    • 大括号 - 覆盖默认优先级并将表达式组合在一起
    • 条件函数 - 执行字符串和对象测试
    • 单引号应该用另一个单引号转义。

    所有可能的布局渲染器都可以在这里找到https://nlog-project.org/config (tab 'layout-renderers')

    如何在 NLog 中过滤的官方文档可以在这里找到:https://github.com/NLog/NLog/wiki/Filtering-log-messages

    【讨论】:

      猜你喜欢
      • 2022-01-16
      • 2018-02-21
      • 1970-01-01
      • 2021-09-16
      • 2022-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-14
      • 2021-12-24
      相关资源
      最近更新 更多