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

Альтернатива / usr / bin / logger для получения логов из Apache в syslog-ng

В настоящее время мы используем регистратор, чтобы получить наши журналы доступа Apache к syslog-ng со строкой, подобной этой, в каждом vhost:

CustomLog "|/usr/bin/logger -p local1.info  -t www_main" combined

Кажется, что почти каждый учебник или совет, который я могу найти относительно Apache и syslog-ng, использует этот метод для получения журналов в syslog-ng. (пример). Остальные используют именованные каналы и источник pipe (). (пример).

Проблема с этим состоит в том, что регистратор разбивает любые строки длиннее 1024 байтов и отправляет их как отдельные записи журнала, что означает, что некоторые записи журнала оказываются в отдельных строках в конечном файле журнала назначения в поле регистрации.

Использование именованного канала и источника pipe () в syslog-ng решает проблему разделения строк, но имеет свой собственный набор мелких проблем и неудобств. Чтобы назвать несколько, именованный канал должен быть создан до запуска Apache и syslog-ng, syslog-ng должен быть запущен до запуска Apache и пометки журналов (что сделано выше с помощью -t) теперь нужно делать в файле конфигурации syslog-ng, а не в vhost.

Эта страница предлагает написать короткий сценарий Perl для использования вместо / usr / bin / logger.

Мне было интересно, знает ли кто-нибудь об альтернативах регистратору, предпочтительно написанному на языке, скомпилированном в собственном коде, или, возможно, обновленной версии регистратора, которая не разделяет длинные строки пополам.

Мне также было бы интересно услышать о любых других решениях проблемы разделения длинных строк журнала, например, о способе их объединения вместе с помощью syslog-ng, когда они достигают серверов журналов.

Обновление моего ответа после изучения этого больше.

Это кажется пределом /usr/bin/logger, который, как ожидается, будет соответствовать RFC syslog. http://www.faqs.org/rfcs/rfc3164.html говорит:

Общая длина пакета ДОЛЖНА быть 1024 байта или меньше.

Если вы отправите в syslog более 1024 символов через командную строку (за пределами Apache), вы столкнетесь с этим же ограничением.

Имейте в виду, что ограничение в 1024 символа, вероятно, существует где-то еще. Я думаю, что максимальный размер для HTTP GET составляет 1024 символа, и я, кажется, помню, что некоторые подпрограммы библиотеки printf имеют жесткое ограничение в 1024 символа (пару лет назад было предупреждение системы безопасности относительно ограничения в 1024 символа относительно некоторого системного журнала / строки утилиты печати, если я правильно помню). Итак, похоже, что у вас есть следующие варианты:

3) Попробуйте запретить вашим HTTP-приложениям записывать длинные сообщения журнала. Легче сказать, чем сделать. 1) Перекомпилировать logger и увеличьте этот лимит. В этом случае имейте в виду, что вы меняете базовую утилиту, и это может привести к неожиданному поведению. Чтобы смягчить это, поместите эту утилиту в / usr / local / bin или / opt / bin. Не заменять /usr/bin/logger. 2) Не отправлять из Apache в системный журнал. Что-то вроде следующего должно работать вокруг ограничения в 1024 символа, поскольку это не использует системный журнал.

CustomLog logs/access_log

4) http://www.oreillynet.com/pub/a/sysadmin/2006/10/12/httpd-syslog.html использует sys::syslog и кажется разумной альтернативой /usr/bin/logger. Вам нужно проверить sys :: syslog для этого же ограничения в 1024 символа. Это Perl, и его должно быть легко переопределить.

Старый ответ:

Похоже, что этот предел настраивается в syslog-ng, согласно http://www.campin.net/syslog-ng/faq.html

По умолчанию syslog имеет сообщения длиной 1024 байта, но это значение можно настроить в syslog-ng 1.5, где вы можете установить для него более высокое значение.

параметры {log_msg_size (8192); };

Последние версии util-linux предоставлять logger способный принять --size параметр:

--size size
    Sets the maximum permitted message size to size.
    The default is 1KiB characters, which is the limit traditionally used
    and specified in RFC 3164. With RFC 5424, this limit has become flexible.
    A good assumption is that RFC 5424 receivers can at least process 4KiB messages.

    Most receivers accept messages larger than 1KiB over any type of syslog protocol.
    As such, the --size option affects logger in all cases (not only when --rfc5424
    was used).

Протокол RFC 5424 используется для регистратора по умолчанию с версии 2.26.

Я лично пользуюсь бесплатными продуктами InterSect Alliance для этого. У них есть специальный продукт Apache, хотя и старый, и более общий продукт, который может преобразовывать любые текстовые журналы в формат syslog.

http://www.intersectalliance.com/projects/EpilogUNIX/index.html

Недавно я столкнулся с этим с клиентом, которому были нужны действительно длинные журналы Apache httpd (что не проблема даже со старыми версиями современных демонов syslog, таких как rsyslog).

Чтобы справиться с этим, я создал logger клоны на некоторых языках сценариев без каких-либо устаревших ограничений на размер сообщений. Видеть:

GitHub: ryran / loggerclones - Команда nix logger переопределена на переносимых языках сценариев