通过 TCP/网络模块的 Syslog-ng 多行输入

Posted

技术标签:

【中文标题】通过 TCP/网络模块的 Syslog-ng 多行输入【英文标题】:Syslog-ng multiline input over TCP/Network module 【发布时间】:2017-10-24 17:28:44 【问题描述】:

我们正在尝试通过 tcp 连接将日志捕获到 syslog-ng。日志看起来像这样:

1810717353--user--notice--IPV4----2017-10-23T16:03:23.015170-04:00--<11>Oct 23 16:03:23 HOSTNAME [443-Multiplexer][0x80000001][xsltmsg][error] xmlfirewall(443-Multiplexer): trans(2607607975)[error][ip] gtid(value):
1810717354--user--notice--IPV4----2017-10-23T16:03:23.015170-04:00--                    Default rule caught error code '
1810717355--user--notice--IPV4----2017-10-23T16:03:23.015170-04:00--                    0x00230001
1810717356--user--notice--IPV4----2017-10-23T16:03:23.015170-04:00--                    '
1810717357--user--notice--IPV4----2017-10-23T16:03:23.015170-04:00--
1810717358--user--notice--IPV4----2017-10-23T16:03:23.015170-04:00--<14>Oct 23 16:03:23 HOSTNAME [443-Multiplexer][value][multistep][info] xmlfirewall(443-Multiplexer): trans(2607607975)[error][ip] gtid(2607607975):

有没有办法在输入过程中去掉系统日志头?如果日志仍然是多行的,那很好,我们可以在读取期间将它们与 logstash 打包,但是我们需要一种方法让日志在写入文件时现在有一个标题..

这是我当前的 syslog-ng 配置:

@version: 3.6
#@include "scl.conf"

options 
        flush_lines (0);
        frac-digits(8);
        use-rcptid (yes);
        time_reopen (10);
        log_fifo_size (1000);
        chain_hostnames (off);
        use_dns (no);
        use_fqdn (no);
        create_dirs (no);
        keep_hostname (yes);
        use-rcptid (yes);
        threaded(yes);
        log_msg_size(32768);
;
    source sourcename
    
       network(ip("0.0.0.0") port(5521) flags(no-parse)); 
    ;
    destination destname
    
        file("/opt/elk/data/syslogs/datapower/$HOST.log"
            #follow-freq(0) multi-line-mode(regexp) multi-line-prefix("^\<\[0-9]2\>[A-z]3 [0-9]2 [0-9]2\:[0-9]2\:[0-9]2")
            create_dirs(yes) dir_owner("elkuser") dir_group("users") dir_perm(0700)
            owner("user") group("group") perm(0600)
            template("$RCPTID--$FACILITY--$PRIORITY--$FULLHOST--$PROGRAM--$ISODATE--$MSGHDR$MSG\n") 
        );
    ;

谢谢

【问题讨论】:

【参考方案1】:

我不确定您要在哪里拆分消息,但根据具体情况,您可以执行以下操作:

如果删除固定数量的字符就够了,可以使用substr模板函数(https://www.balabit.com/documents/syslog-ng-ose-latest-guides/en/syslog-ng-ose-guide-admin/html/reference-template-functions.html) 如果你想加入多行消息,你可能需要检查网络源的多行选项:https://www.balabit.com/documents/syslog-ng-ose-latest-guides/en/syslog-ng-ose-guide-admin/html/reference-source-network.html 如果您需要对这些日志进行大量自定义处理,编写自定义 python 解析器 (https://www.balabit.com/documents/syslog-ng-ose-latest-guides/en/syslog-ng-ose-guide-admin/html/python-parser.html) 可能会更容易。请注意,Python 解析器需要最新版本的 syslog-ng。

此外,您似乎正在以某种方式将日志发送到 Elasticsearch(至少我怀疑目标中的 elk 代表的是):最新版本的 syslog-ng 可以直接执行此操作:https://www.balabit.com/documents/syslog-ng-ose-latest-guides/en/syslog-ng-ose-guide-admin/html/configuring-destinations-elasticsearch2.html

HTH, 罗伯特

【讨论】:

以上是关于通过 TCP/网络模块的 Syslog-ng 多行输入的主要内容,如果未能解决你的问题,请参考以下文章

syslog-ng 是不是支持网络命名空间?

如果没有配置传输,但设置了 UDP 端口,syslog-ng 会发生啥?

syslog-ng VS. rsyslog

51.使用TCP协议检测网络性能

linux下syslog-ng日志集中管理服务部署记录

为啥 syslog-ng 会截断输出?