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