LINUX.ORG.RU

Как по-хитрому настроить syslog?

 , ,


1

3

Хочу писать что-то вроде

"Room 1443: Door closed"
"Room 1322: Light is off"

И чтобы syslog сам расфасовывал это по файлам room_1443.log и room_1322.log

syslog так умеет? Или вообще никак? Есть только syslogd, никакого rsyslogd.

Я подобное хотел реализовать очень давно, но так и не нашёл решения, кроме как заставить каждую "комнату" (у меня на тот момент были не комнаты, но не суть) дёргать логгер самостоятельно, но, думаю, ты понимаешь, что за монструозина получится в итоге.

В systemd (journald) подобный функционал уже есть, но опять же, только для своих (то есть для написанных юнитов).

Подпишусь, пожалуй.

r3lgar ★★★★★
()

rsyslog вроде может

imb ★★
()

Ставь syslog-ng

Вот кусок моего конфига, думаю, суть понятна:

filter f_errors { level(err..emerg) or message ("error" flags(ignore-case)) or message ("failed" flags(ignore-case)) or message ("flood" flags(ignore-case)) or message ("invalid" flags(ignore-case)); };

filter f_network { match("dhcpcd" value("PROGRAM") flags(ignore-case)) or match("ntpd" value("PROGRAM") flags(ignore-case)) or match("squid" value("PROGRAM") flags(ignore-case)) or match("net." value("PROGRAM") flags(ignore-case)) or match("dhcpd" value("PROGRAM") flags(ignore-case)); };
filter f_gui { match("hald" value("PROGRAM") flags(ignore-case)) or match("kdm" value("PROGRAM") flags(ignore-case)); };

Kroz ★★★★★
()
Ответ на: комментарий от someoneelsenotme

Ок, вот более-менее полный кусок:

source src { system(); internal(); unix-stream("/dev/log"); file("/proc/kmsg");unix-stream("/chroot/dhcp/dev/log"); };
...
destination d_errors { file("/var/log/errors.log"); };
...
filter f_errors { level(err..emerg) or message ("error" flags(ignore-case)) or message ("failed" flags(ignore-case)) or message ("flood" flags(ignore-case)) or message ("invalid" flags(ignore-case)); };
...
log { source(src); filter(f_errors); destination(d_errors); };

source - откуда брать инфу

destination - куда выдавать. Кстати, можно не только в файл, но и в stdin программы - я так делал вывод уведомления в KDE при критической ошибке с HDD, было время.

filter - фильтр. В данном случае ошибка - то, что имеет уровень err..emerg, или где сообщения содержат слова «error», «failed», «flood», «invalid». Твоя задача решается этим механизмом.

log - объединяет эти три составляющих в правило.

Отвечает на твой вопрос?

Kroz ★★★★★
()
Последнее исправление: Kroz (всего исправлений: 1)

Заменяй логгер на metalog, он прекрасно умеет расфасосывать по регекспам и условиям, в дефолтном конфиге всё расписано с кучей примеров.

Bfgeshka ★★★★★
()

Есть только syslogd

то ты хочешь syslog facility

logger -p local2.info -t Room_2 «Lights off»
ну или реализовать тому, кто посылает логи facility и настроить syslogd как-то так:
local2.* /var/log/room_2.log

bass ★★★★★
()
Последнее исправление: bass (всего исправлений: 2)
Ответ на: комментарий от bass

local2.* /var/log/room_2.log

Так не получится ибо комнат огромное количество (2000+), раз в n дней случаются переназначения, слияния и проч.

someoneelsenotme
() автор топика

А чем старый дедовский grep «Room ####» не подходит? Написать хелпер-алиас можно для удобства

mersinvald ★★★★★
()
Ответ на: комментарий от mersinvald

Тем что отдельный файл можно вкинуть другому человеку, а давать ему n-метровый файл и говорить «ты, типа, отгрепай нужный рум, а на остальное не смотри, ибо NDA»

someoneelsenotme
() автор топика
Ответ на: комментарий от someoneelsenotme

Как воркэраунд можно извернуться через mkfifo, если комнаты не добавляются-исчезают динамически в непредсказуемой манере, если хочется прям отдельных файликов.
Ну или крон и скриптом раскидать.

mersinvald ★★★★★
()
Последнее исправление: mersinvald (всего исправлений: 1)
Ответ на: комментарий от someoneelsenotme

Тем что отдельный файл можно вкинуть другому человеку, а давать ему n-метровый файл и говорить «ты, типа, отгрепай нужный рум, а на остальное не смотри, ибо NDA»

В чём проблема сначала отгрепать в файл и потом вкинуть другому человеку?

Или не использовать сислог вообще, а заставить своё поделие распихивать логи по файликам самостоятельно.

Или, как уже сказали, пользовать syslog-ng.

ИМХО проблема высосана из пальца.

Stanson ★★★★★
()
Ответ на: комментарий от Stanson

а заставить своё поделие распихивать логи по файликам самостоятельно.

Сейчас так и есть. Хотелось не наяривать хендлеры самостоятельно,а юзать уже готовое системное решение.

someoneelsenotme
() автор топика
Ответ на: комментарий от someoneelsenotme

Сейчас так и есть. Хотелось не наяривать хендлеры самостоятельно,а юзать уже готовое системное решение.

Тогда сортируй по файликам посредством syslog-ng и не морочь людям голову. :)

syslog - это в общем-то достаточно конкретный протокол, в котором не предусмотрено ничего кроме разделения сообщений по Facility и Severity. ( https://tools.ietf.org/html/rfc3164 )

Все остальные хотелки с фильтрованием сообщенй по каким-то иным критериям придётся делать вне этого протокола - либо фильтрами syslog-ng, либо тем же grep'ом, например.

Stanson ★★★★★
()
Ответ на: комментарий от someoneelsenotme

Там слака 12тилетней давности.

Ну так собери для неё syslog-ng - в чём проблема-то? Сотфину написать осилил, а готовый пакет собрать не можешь?

В крайнем случае, настрой на слаке форвардинг сислога на другую машину, а на неё уже накати syslog-ng.

Stanson ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.