我想将日志从本地计算机转发到远程服务器。借助 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));
}