在 syslog-ng 中使用网络指令时“空闲时发生 EOF”

在 syslog-ng 中使用网络指令时“空闲时发生 EOF”

我想将日志从本地计算机转发到远程服务器。借助 SSH 隧道,可以通过 localhost:5514 访问远程服务器。我编写了以下配置:

# Filters
filter f_local0 { facility(local0); };
filter f_worker { program("^worker."); };

# Destinations
destination d_log01_local { file("/home/myuser/logs/worker/$YEAR$MONTH$DAY/$PROGRAM.$YEAR$MONTH$DAY" template("$HOST $MSG\n") create_dirs(yes) dir_group("adm") group("adm") dir_perm(0770) perm(0644) ); };
destination d_log01_remote { network("localhost" transport(tcp) port(5514) persist-name("remote_worker") disk-buffer( reliable(yes) disk-buf-size(50000000) )); };

# Logs
log { source(s_src); filter(f_local0); filter(f_worker); destination(d_log01_local); };
log { source(s_src); filter(f_local0); filter(f_worker); destination(d_log01_remote); };

本地目标运行正常,但远程目标却不行:我没有收到位于 localhost:5514 的服务器上的任何日志。

当我 时tail -f /var/log/syslog,系统日志记录以下几行:

Oct 22 11:25:05 esad-10076 syslog-ng[17319]: Syslog connection established; fd='35', server='AF_INET(127.0.0.1:5514)', local='AF_INET(0.0.0.0:0)'
Oct 22 11:25:05 esad-10076 syslog-ng[17319]: EOF occurred while idle; fd='35'
Oct 22 11:25:05 esad-10076 syslog-ng[17319]: Syslog connection broken; fd='35', server='AF_INET(127.0.0.1:5514)', time_reopen='60'

我不明白该错误是什么,也不知道如何修复它。

我应该说明的是,在编写此 conf 之前,我使用了另一个 confsyslog来代替 ,network并且此 conf 运行完美。我现在只需要使用网络来使用 的功能,reliable以便在网络中断时不会丢失任何日志。

# Filters
filter f_local0 { facility(local0); };
filter f_worker { program("^worker."); };

# Destinations
destination d_log01_local { file("/home/myuser/logs/worker/$YEAR$MONTH$DAY/$PROGRAM.$YEAR$MONTH$DAY" template("$HOST $MSG\n") create_dirs(yes) dir_group("adm") group("adm") dir_perm(0770) perm(0644) ); };
destination d_log01_remote { syslog("localhost" transport(tcp) port(5514) persist-name("remote_worker")); };

# Logs
log { source(s_src); filter(f_local0); filter(f_worker); destination(d_log01_local); };
log { source(s_src); filter(f_local0); filter(f_worker); destination(d_log01_remote); };

答案1

问题发生在另一端:接收方。目前有两种不同的系统日志协议:rfc3164一个(旧的)和rfc5424一个(新的)。参见此博客文章了解更多信息。

我使用旧协议在服务器上接收日志,并且消息与使用新协议的发送机器发送的日志不匹配(因此出现“标头”问题)。

我的会议如下:

source mysource {
        syslog(
               ip(0.0.0.0) 
               transport(udp) 
               port(514) 
               max-connections(80) 
               keep-hostname(yes) 
        );
        syslog(
               ip(0.0.0.0) 
               transport(tcp) 
               port(514) 
               max-connections(80) 
               log_iw_size(8000)
               keep-hostname(yes) 
        );
};

...

当我tail -f /var/log/syslog,我收到以下错误:

Oct 29 16:37:28 servername syslog-ng[718]: Syslog connection accepted; fd='83', client='AF_INET(127.0.0.1:40034)', local='AF_INET(0.0.0.0:514)'
Oct 29 16:37:28 servername syslog-ng[718]: Invalid frame header; header=''
Oct 29 16:37:28 servername syslog-ng[718]: Syslog connection closed; fd='83', client='AF_INET(127.0.0.1:40034)', local='AF_INET(0.0.0.0:514)'

用以下行代替这两个syslog指令可以修复该问题:

source mysource {
    network(transport(tcp) port(514) max-connections(80));
}

相关内容