使用此rsyslog配置:
$template MYFORMAT,"%msg%\n"
if $programname == 'mylog' then {
action(type="omfile" file="/var/log/mylog.log" template="MYFORMAT")
& stop
}
和这个PHP脚本:
<?php
openlog('mylog', LOG_ODELAY, LOG_LOCAL0);
syslog(LOG_INFO, date('Y-m-d: ') . 'stuff has happened!');
closelog();
我的输出总是在记录的消息之前(在自定义日志文件中)有一个空格。
2015-06-10: stuff has happened! (there's a space at the beginning of this line)
答案 0 :(得分:2)
根据RFC 3164,在syslog标记中的冒号之后的所有内容都被计为%msg%
字段的一部分,包括任何空格字符。在各种rsyslog文档/博客文章中都提到了这一点,例如https://www.rsyslog.com/log-normalization-and-the-leading-space/或此处https://rsyslog.readthedocs.io/en/latest/configuration/property_replacer.html的sp-if-no-sp
文档
由于它是%msg%
字段的一部分,所以有两种方法可以记录行而不用前导空格:
将前缀作为每个日志行的一部分,例如:
$template MYFORMAT,"[app]: %msg%\n"
剥离前导空格字符。您可以使用$
符号说“包括所有内容,直到行尾。”味精字符为1索引,因此从字段2开始。
$template MYFORMAT,"%msg:2:$%\n"
答案 1 :(得分:0)
修改
$template MYFORMAT,"%msg%\n"
代表
$template MYFORMAT,"%msg:2:2048%\n"
答案 2 :(得分:0)
您还可以如下使用基于正则表达式的属性替换器:
template(name="logfmt" type="string" string="%msg:R,ERE,1,FIELD:^[ \t]*(.*)$--end%\n")
上面的语句从与给定的正则表达式(^[ \t]*(.*)$
)匹配的MSG字符串中选择第一组(前导空格后的所有字符)。请注意,正则表达式的语法为POSIX ERE(扩展正则表达式)。
答案 3 :(得分:0)
是的,rsyslog正在添加空格,因为它位于date('Y-m-d: ')
像这样去除结肠后的空格:
更改
"syslog(LOG_INFO, date('Y-m-d: ') . 'stuff has happened!');"
到
syslog(LOG_INFO, date('Y-m-d:') . 'stuff has happened!');"
php应该看起来像这样:
<?php
openlog('mylog', LOG_ODELAY, LOG_LOCAL0);
syslog(LOG_INFO, date('Y-m-d:') . 'stuff has happened!');
closelog();