最近在查一个混合云的BUG, 就是我们把虚拟机的agent的日志透传出来,放到我们的host主机上,我们通过syslog 服务来进行日志的重定向,但是在重定向的日志时,发现如果python打印出ERR堆栈,通过syslog重定向之后,在服务端打到文件中时,他会打印到好几个文件中去了,比如
错误日志:
2017-05-08T11:08:04.209+00:00 localhost neutron-openvswitch-agent ERROR [pid:16523] [rpc_terminal_req_timeout][tid:63209296] [utils.py:79 execute]
Command: ['sudo', 'arping', '-A', '-I', 'tunnel_bearing', '-c', '3', '192.16.0.2']
Exit code: 2
Stdout: ''
Stderr" 'arping: Device tunnel_bearing not available.'
到服务端之后,就会重定向到neutron-openvswitch-agent.log文件,Command.log文件,Exit.log文件,Stdout.log文件,Stderr.log文件中去了,没有统一重定向到neutron-openvswitch-agent.log文件中。
如何解决呢?
这是因为堆栈日志中是有换行符的,在透传到服务端syslog时,就会以换行符来打印,所以我们在透传到服务端的时候,把换行符都替换掉,这个利用syslog-ng的rewrite特性。
修改配置文件/etc/syslog-ng/syslog-ng.conf
filter f_vm_level { level(err); }
rewrite r_escape_new_line {subst("\n", " ", value("MSG"), flags("global"));};
destionation d_host { tcp(197.168.120.225, port(514)); };
log { source(s_host); filter(f_vm_level); rewrite(r_escape_new_line); destionation(d_host)}
重启下syslog服务,systemctl restart syslog
这样透传到服务端上日志都可以打到neutron-openvswitch-agent.log文件中了。
2017-05-08T11:08:04.209+00:00 localhost neutron-openvswitch-agent ERROR [pid:16523] [rpc_terminal_req_timeout][tid:63209296] [utils.py:79 execute] Command: ['sudo', 'arping', '-A', '-I', 'tunnel_bearing', '-c', '3', '192.16.0.2']
Exit code: 2 Stdout: '' Stderr" 'arping: Device tunnel_bearing not available.'
如果rewrite了之后,依然没有效果,可以尝试下
Try to add the flags(no-multi-line) option to your source definition, like:
source s_src {
system(flags(no-multi-line));
internal();
};