Я пытаюсь получить rsyslog на RHEL 6, чтобы отобразить время, когда сообщение было зарегистрировано, как временную метку unix. Я начал с чтения документации на http://www.rsyslog.com/doc/property_replacer.html. Поскольку есть варианты свойств в старом и новом стиле, я проверил свой номер версии:
[root@sourwood remote]# rpm -qa | grep rsyslog
rsyslog-pgsql-5.8.10-6.el6.x86_64
rsyslog-5.8.10-6.el6.x86_64
[root@sourwood remote]#
Это означает, что я использую версию 5.8. В документации говорится, что нужно использовать параметры свойств нового стиля в версиях выше 6, поэтому я должен использовать параметры свойств старого стиля.
В верхней части раздела, описывающего параметры старого стиля, указано, что перечисленные ниже параметры существуют в версиях выше 5.5.3, так как 5.8.10 выше 5.5.3, что не должно быть проблемой.
Основываясь на документации, я создал следующий шаблон (немного усеченный для ясности):
$template proxyTemplate,"%timegenerated:::date-unixtimestamp%|%timegenerated:::date-rfc3339%|...\n"
Затем я использую этот шаблон следующим образом:
if \
$programname contains 'squid' \
then /var/log/remote/squid.log;proxyTemplate
Сообщения от Squid регистрируются, форматирование rfc3339 работает, а временная метка unix - нет. Вот усеченный образец из логов:
Apr 29 14:59:09|2013-04-29T14:59:09.443172+01:00|...
Я делаю что-то неправильно? Возможно, я упустил какую-то тонкость? Или я наткнулся на ошибку?
Конечно, я также пробовал использовать параметры свойств нового стиля, но безрезультатно.
К сожалению (потому что я тоже этого хотел), документация неверна, и эта функция фактически появилась в версии 6.3.8. Следующий текст объясняет мои выводы.
Согласно репозиторию проекта git, первое упоминание о unixtimestamp
происходит в коммите b88ba94, который присутствует только в теге v6.3.8:
$ git clone git://git.adiscon.com/git/rsyslog.git
$ cd rsyslog
$ git log --reverse -S 'unixtimestamp' --oneline | head -1
b88ba94 added "date-unixtimestamp" property replacer option to format as a unix timestamp
$ git tag --contains b88ba94
v6.3.10
v6.3.11
v6.3.12
v6.3.8
v6.3.9
v6.4.0
...
$
Затем я дважды проверил наличие unixtimestamp
в SRPM на случай, если он был перенесен обратно - но не тут-то было.
Наконец, если вы отлаживаете конфигурацию с помощью команды rsyslogd -c 5 -d -N 1 -f /etc/rsyslog.conf
, вы можете увидеть предупреждение, о котором rsyslog не знает unixtimestamp
:
$ rsyslogd -c 5 -d -N 1 -f /etc/rsyslog.conf
...
8913.783769999:7f45539b3700: cfline: '$template NagiosPassiveServiceCheck, "%TIMESTAMP:::date-unixtimestamp% PROCESS_SERVICE_CHECK_RESULT;%hostname%;FOO;3;%msg:2:$%\n"'
8913.783783726:7f45539b3700: Invalid field option 'date-unixtimestamp' specified - ignored.
$
Проверьте значение аргумента совместимости -c
что ваша система использует. Этот аргумент может радикально изменить то, как rsyslog интерпретирует файл конфигурации, поэтому убедитесь, что вы разрабатываете и отлаживаете конфигурацию с тем же уровнем, который вы будете использовать в производстве (см. /etc/sysconfig/rsyslog
установить его).
В качестве альтернативы rsyslog, возможно, стоит взглянуть на syslog-ng (доступный в репозиториях EPEL), который позволяет выводить сообщения с метками времени, представленными как секунды от эпохи.