【问题标题】:How to split Rsyslog MSG by REGEX expression如何通过 REGEX 表达式拆分 Rsyslog MSG
【发布时间】:2023-02-20 04:48:29
【问题描述】:

我的设备有系统日志消息。我正在使用 Rsyslog 并希望使用 REGEX 表达式从特定文件夹收集特定消息。

使用旧语法的配置按预期工作:

:msg, regex, "hostname0. %%01SHELL" /var/log/tel/hostname.log

...产生以下日志(示例):

Feb 1 17:41:18 hostname01 %%01SHELL/6/DISPLAY_CMDRECORD(s)[5461]: Recorded display command information. (Task=FW, Ip=**, VpnName=, User=_system_, AuthenticationMethod="Null", Command="display engine statistics system")

Feb 1 17:42:18 hostname02 %%01SHELL/6/DISPLAY_CMDRECORD(s)[5461]: Recorded display command information. (Task=FW, Ip=**, VpnName=, User=_system_, AuthenticationMethod="Null", Command="display engine statistics system")

我的新 RainerScript 语法模板不起作用:

template (name="HOST_SHELL" type="string" string="/var/log/tel/%$YEAR%-%$MONTH%-%$DAY%-HOST-SHELL.log")

if re_match($msg, 'hostname0. %%01SHELL')
    then {action(type="omfile" dynaFile="HOST_SHELL")
stop
}

但是,什么也没有发生。也许有另一种方法可以解决问题,或者更正我的模板。

将来计划过滤:

hostname0. %%01ERRORS in folder /var/log/tel/%$YEAR%-%$MONTH%-%$DAY%-HOST-ERRORS.log 

【问题讨论】:

    标签: linux rsyslog


    【解决方案1】:

    在您的 RainerScript 语法配置中,您在 stop 语句之前缺少 if 语句的右大括号 } 。你应该像这样在动作语句之后包含它:

    template (name="HOST_SHELL" type="string" string="/var/log/tel/%$YEAR%-%$MONTH%-%$DAY%-HOST-SHELL.log")
    
    if re_match($msg, 'hostname0. %%01SHELL') then {
        action(type="omfile" dynaFile="HOST_SHELL")
        stop
    }
    
    

    此外,您可能希望修改正则表达式模式以在主机名匹配模式中包含点字符 (.)。点字符在正则表达式中有特殊含义,它匹配任何字符。要匹配文字点字符,您可以使用反斜杠 (.) 将其转义。这是一个更新的正则表达式模式:

    if re_match($msg, 'hostname0..* %%01SHELL') then {
        ...
    }
    
    

    这应该匹配任何以“hostname0”开头的消息。后跟任何字符,然后是“%%01SHELL”

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多