为啥 syslog-ng 会截断输出?

Posted

技术标签:

【中文标题】为啥 syslog-ng 会截断输出?【英文标题】:Why is syslog-ng truncating output?为什么 syslog-ng 会截断输出? 【发布时间】:2019-11-08 20:18:21 【问题描述】:

我正在将系统日志从防火墙发送到 syslog-ng 3.5.6,它在 CentOS 7 服务器上运行。我可以查看通过 tcpdump 进来的日志,一切看起来都很好。但是,一旦 syslog-ng 处理日志并将它们发送到输出文件,它们就会被截断。我还有其他未截断的系统日志源。

这是 tcpdump 的示例:

192.168.1.1.10002 > 192.168.2.1.514: SYSLOG, length: 694
        Facility authpriv (10), Severity notice (5)
        Msg: 1 2019-11-08T19:30:08 192.168.1.1 CP-GW - Log [Fields@1.3.6.1.4.1.2620 Action="accept" UUid="0x5dc5c542" rule="117" rule_uid="C94E97R1" rule_name="Test" src="192.168.1.38" dst="192.168.160.1" proto="17" user="test administrator (test_administrator)(+)Jtest.Administrator (FI) @ TEST - TEST - TEST (Jtest_administrator)(+)Testl.Administ..." src_user_name="test administrator (test_administrator)(+)Jtest.Administrator (FN) @ TEST - TEST - TEST (Jtest_administrator)(+)Testl.Administ..." src_machine_name="TEST@TEST.TEST.com" snid="76d73747" product="***-1 & FireWall-1" service="53" s_port="64642" product_family="Network"]
19:30:09.083410 IP (tos 0x0, ttl 55, id 0, offset 0, flags [DF], proto UDP (17), length 722)

输出文件如下所示:

Nov  8 19:30:08 192.168.1.1 CP-GW:

这是 syslog-ng conf.d 文件:

destination d_c2 
  file ("/var/log/fw-test/$SOURCEIP/$C_YEAR-$C_MONTH-$C_DAYT$C_HOUR.log"
    owner(root) group(splunk)
    perm(0755) dir_perm(0755)
    create_dirs(yes)
  );
;

filter f_c2 
  netmask(192.168.1.1);
;

log 
  source(s_udp514);
  filter(f_c2);
  destination(d_c2);
;

还有 syslog-ng.conf 的选项部分:

options 
    flush_lines (100);
    time_reopen (10);
    log_fifo_size (1000);
    chain_hostnames (yes);
    use_dns (no);
    use_fqdn (no);
    create_dirs (no);
    keep_hostname (yes);
    log-msg-size(1048576);
;

任何想法为什么输出被截断?

提前致谢

【问题讨论】:

【参考方案1】:

这是正确的行为,因为除了标题和结构化数据之外,您的消息不包含任何内容。

输入采用 IETF 系统日志格式 (RFC 5424):

SYSLOG-MSG = HEADER SP STRUCTURED-DATA [SP MSG]
HEADER = PRI VERSION SP ISOTIMESTAMP SP HOSTNAME SP APP-NAME SP PROCID SP MSGID

MSG 这里是可选的,在你的情况下它是空的:

1 2019-11-08T19:30:08 192.168.1.1 CP-GW - Log [Fields@1.3.6.1.4.1.2620 Action="accept" UUid="0x5dc5c542" rule="117" rule_uid="C94E97R1" rule_name="Test" src="192.168.1.38" dst="192.168.160.1" proto="17" user="test administrator (test_administrator)(+)Jtest.Administrator (FI) @ TEST - TEST - TEST (Jtest_administrator)(+)Testl.Administ..." src_user_name="test administrator (test_administrator)(+)Jtest.Administrator (FN) @ TEST - TEST - TEST (Jtest_administrator)(+)Testl.Administ..." src_machine_name="TEST@TEST.TEST.com" snid="76d73747" product="***-1 & FireWall-1" service="53" s_port="64642" product_family="Network"] here would come the message body

输出是旧的 BSD 系统日志格式 (RFC 3164),它不包含任何结构化数据:

Nov  8 19:30:08 192.168.1.1 CP-GW:

您可以通过创建包含所有重要字段的模板或使用不同的输出格式(例如原始 IETF syslog 格式)来避免丢失 sdata 信息:

file ("/var/log/fw-test/$SOURCEIP/$C_YEAR-$C_MONTH-$C_DAYT$C_HOUR.log"
  owner(root) group(splunk) perm(0755) dir_perm(0755) create_dirs(yes)
  flags(syslog-protocol)
);

【讨论】:

谢谢,这很有帮助!

以上是关于为啥 syslog-ng 会截断输出?的主要内容,如果未能解决你的问题,请参考以下文章

Syslog-ng RHEL 的安装和配置

syslog-ng读取文件权限被拒绝

Meraki 和 Syslog-NG

syslog-ng 2.09 线程()语法

syslog-ng+loganalyzer(非常详细配置文件)部署收集操作日志

syslog-ng 尾文件缺少最后一行