Назад | Перейти на главную страницу

Метки времени unix в rsyslog на RHEL6

Я пытаюсь получить 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), который позволяет выводить сообщения с метками времени, представленными как секунды от эпохи.