Смутно с форматом сообщений syslog
Я немного запутался в формате сообщений syslog. Мне нужно написать программу, которая анализирует сообщения syslog. Когда я прочитал то, что получаю в моем экземпляре syslog-ng, я получаю такие сообщения:
Jan 12 06:30:00 1.2.3.4 apache_server: 1.2.3.4 - - [12/Jan/2011:06:29:59 +0100] "GET /foo/bar.html HTTP/1.1" 301 96 "-" "Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.9.2.12) Gecko/20101026 Firefox/3.6.12 ( .NET CLR 3.5.30729)" PID 18904 Time Taken 0
Я могу четко определить реальное сообщение (которое в данном случае является сообщением журнала доступа Apache). Остальные - это метаданные о самом сообщении syslog.
Однако, когда я читал RFC 5424, примеры сообщений выглядят следующим образом:
без структурированных данных
<34>1 2003-10-11T22:14:15.003Z mymachine.example.com su - ID47 - BOM'su root' failed for lonvick on /dev/pts/8
или со структурированными данными
<165>1 2003-10-11T22:14:15.003Z mymachine.example.com evntslog - ID47 [[email protected] iut="3" eventSource="Application" eventID="1011"] BOMAn application event log entry...
Итак, теперь я немного смущен. Каков правильный формат сообщения syslog? Это вопрос спецификации, где RFC 5424 устарели RFC 3164?
Ответы
Ответ 1
Проблема в этом случае заключается в том, что apache регистрируется через стандартный syslog (3) или через регистратор. Это поддерживает только старый (RFC3164) формат syslog, т.е. Здесь нет структурированных данных.
Чтобы поля из журнала apache отображались как структурированные данные RFC5424, apache должен был форматировать журнал таким образом.
Первый пример - неправильный syslog RFC3164, потому что значение приоритета удаляется из заголовка. Правильный формат RFC3164 будет выглядеть следующим образом:
<34>Jan 12 06:30:00 1.2.3.4 apache_server: 1.2.3.4 - - [12/Jan/2011:06:29:59 +0100] "GET /foo/bar.html HTTP/1.1" 301 96 "-" "Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.9.2.12) Gecko/20101026 Firefox/3.6.12 ( .NET CLR 3.5.30729)" PID 18904 Time Taken 0
Традиционно сообщения syslog rfc3164 сохраняются в файлы с удаленным значением приоритета.
Другие два находятся в формате RFC5424.
Ответ 2
Если у вас есть доступ к установленному syslog-демонам в системе, вы можете настроить его для записи журналов (полученных как локально, так и через сеть) в другом формате. Например, rsyslogd позволяет настроить собственный формат (просто написать шаблон), а также, если я правильно помню, имеет встроенный шаблон для хранения в формате json. И есть библиотеки практически на любом языке для анализа json.