Пустое место в начале файла журнала 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)

1 ответ

Согласно RFC 3164 все, что находится после двоеточия в теге системного журнала, считается частью %msg%поле, включая любой пробел. Это упоминается в различных статьях документации / блогов rsyslog, например https://www.rsyslog.com/log-normalization-and-the-leading-space/ илиsp-if-no-spдокументация здесь https://rsyslog.readthedocs.io/en/latest/configuration/property_replacer.html

Поскольку это часть %msg% поле, есть два способа записать строки без начального пробела:

  • Жестко закодируйте префикс как часть каждой строки журнала, например:

    $template MYFORMAT,"[app]: %msg%\n"
    
  • Удалите начальный пробел. Вы можете использовать$знак, чтобы сказать "включить все до конца строки". Символы msg имеют индекс 1, поэтому начните с поля 2.

    $template MYFORMAT,"%msg:2:$%\n"
    

Изменить это

$template MYFORMAT,"%msg%\n"

за

$template MYFORMAT,"%msg:2:2048%\n"

You can also use regex based property replacer as follows:

template(name="logfmt" type="string" string="%msg:R,ERE,1,FIELD:^[ \t]*(.*)$--end%\n")

The statement above picks the 1st group (all chars after leading spaces) from MSG string matching the given regex (^[ \t]*(.*)$). Note that, the regex syntax is POSIX ERE (Extended Regular Expressions).

Да, 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();
Другие вопросы по тегам