项目中需要使用syslog打印带有换行符’\n’的字符串,期望能够在log里将其分行打印。结果打印出来全在一行内,换行符被以’#012’替代。
为了验证问题,简单写了个测试代码:
#include <syslog.h>
int main(int argc, char *argv[])
{
openlog("testlog", LOG_PID, LOG_LOCAL2);
syslog(LOG_INFO, "aaaa\nbbbb\n");
closelog();
return 0;
}
[root@localhost ~]# gcc test.c -o test
[root@localhost ~]# ./test
执行后,查看/var/log/messages ,日志打印如下,中间的’\n’变成了’#012’
Mar 26 04:12:44 localhost testlog[43624]: aaaa#012bbbb
012是换行符LN的8进制值,也就是十进制的10。看起来syslog打印时将’\n’进行转义后打印出来了。
那怎样才能让syslog打印正常换行呢?最后发现可以修改/etc/rsyslog.conf配置,添加
$EscapeControlCharactersOnReceive off
让其对’\n’等特殊字符不进行转义。
[root@localhost ~]# echo '$EscapeControlCharactersOnReceive off' >> /etc/rsyslog.conf
[root@localhost ~]# systemctl restart rsyslog //需要重启服务生效
[root@localhost ~]# ./test
再次查看/var/log/message,已经可以正常换行
Mar 26 04:26:37 localhost testlog[43815]: aaaa
bbbb