rsyslog日志文件开头的空白空间

时间:2015-06-10 00:35:04

标签: php linux logging rsyslog

使用此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)

4 个答案:

答案 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.htmlsp-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();