最近在查一个混合云的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();

};

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐