从 Syslog-NG 中的 MESSAGE 中提取值

从 Syslog-NG 中的 MESSAGE 中提取值

我收到如下系统日志消息:

[[电子邮件保护]net_id="325" station="431"ault="16384"] [NotificationHandler] NMS 错误:STCRC/NOTTS 网络:Enas 站:CED Elmas 序列号:11347

没有 Python 解析器,我也能正确接收日志。

现在,我需要从上面的 MESSAGE 中提取一些值,并且我配置了 syslog-ng.conf 如下:

source s_network {
        udp();
        tcp();
};

python {

import re

class SngRegexParser(object):

    def init(self, options):

        pattern = options["regex"]
        self.regex = re.compile(pattern)
        self.counter = 0
        return True

    def deinit(self):

        pass

    def parse(self, log_message):

        decoded_msg = log_message['MESSAGE'].decode('utf-8')
        match = self.regex.match(decoded_msg)
        if match:
            for key, value in match.groupdict().items():
                log_message[key] = value
            log_message['MY_COUNTER'] = str(self.counter)
            self.counter += 1
            return True
        return False
};

parser my_python_parser{
    python(
        class("SngRegexParser")
        options("regex", "station: (?P<station>\\d+), error: (?P<error>\\d+), Net: (?P<Net>\\d+), Station: (?P<Station>\\d+), serial-num: (?P<serial-num>\\d+) (?P<padding>.*$)")
    );
};

destination d_file { file("/var/log/app_network.log"); };

destination d_mysql {
        sql(
                type(mysql)
                host ("127.0.0.1")
                username("USER")
                password("PASSWORD")
                database("syslog")
                table("logs")
                columns("host", "facility", "priority", "datetime", "program", "msg", "StNum", “Error”, “Network”, “StName”, “Serial”)
                values("${HOST}", "${FACILITY_NUM}", "${LEVEL_NUM}", "${R_YEAR}-${R_MONTH}-${R_DAY} ${R_HOUR}:${R_MIN}:${R_SEC}", "${PROGRAM}", "${MSGONLY}", "${station}", "${error}", "${Net}", "${Station}", "${serial-num}")

                indexes("host", "program", "datetime", "facility", "priority")
                null("")
        );
};


log { source(s_local); source(s_network); parser(my_python_parser); destination(d_file); destination(d_mysql); };

但是重新加载 Syslog-NG 后,我没有收到任何日志,并且 Syslog-NG 状态显示此错误:

初始化新配置时出错,使用旧配置

怎么了?

感谢你们

答案1

这里有多个问题。

解决第一个问题就可以使用新配置启动 syslog-ng。

  1. 捕获组的组名必须是有效的 Python 标识符:

调用 Python 函数时出现异常;caller='my_python_parser'、class='SngRegexParser'、function='init'、exception='error: 组名 'serial-num' 位置 112 处的字符不正确' ``` 修复:使用(?P<serial_num>\\d+)而不是(?P<serial-num>\\d+)

  1. 正则表达式与提供的消息不匹配。请进行相应调整。

    消息的开头看起来像structured-data来自RFC 5424. syslog-ng 有针对此格式的原生/快速解析器,请查看syslog-procotol的旗帜network()

  2. 如果您共享的是完整配置,而不仅仅是片段:

    不要忘记@version: 3.19在顶部添加配置版本(),并定义s_local源。

答案2

感谢你的回复。

1-我昨天做了这个手术。

2-我昨天做了这个操作,现在我正在使用:

@version: 3.19

source s_network {
        syslog(transport(udp) port(514));
        syslog(transport(tcp) port(514));
};

3- modified.

Unfortunately, the configuration with the correction is not working.

Now the configuration file is as follows:

source s_network {
        syslog(transport(udp) port(514));
        syslog(transport(tcp) port(514));
};

python {

import re

class SngRegexParser(object):

    def init(self, options):

        pattern = options["regex"]
        self.regex = re.compile(pattern)
        self.counter = 0
        return True

    def deinit(self):

        pass

    def parse(self, log_message):

        decoded_msg = log_message['MESSAGE'].decode('utf-8')
        match = self.regex.match(decoded_msg)
        if match:
            for key, value in match.groupdict().items():
                log_message[key] = value
            log_message['MY_COUNTER'] = str(self.counter)
            self.counter += 1
            return True
        return False
};

parser my_python_parser{
    python(
        class("SngRegexParser")
        options("regex", "station: (?P<station>\\d+), error: (?P<error>\\d+), Net: (?P<Net>\\d+), Station: (?P<Station>\\d+) (?P<padding>.*$)")
    );
};

destination d_file { file("/var/log/app_network.log" template("error: $error Net: $Net Station: $Station my_counter: $MY_COUNTER\n")); };


log { source(s_network); parser(my_python_parser); destination(d_file); };

还有其他想法吗?

相关内容