
В системном журнале (Raspbian rsyslog swVersion="8.1901.0"),
Я пытаюсь сопоставить / отфильтровать системное сообщение, содержащее определенную строку, КАК по /var/log/syslog
(по умолчанию), ТАК И по отдельному пользовательскому файлу журнала, например: /var/log/nut.log
.
Мне удалось добиться этого, разместив следующие строки фильтра /etc/rsyslog.conf
:
# NUT logging: Include USB msgs since montoring UPS via only USB
:msg,contains,"USB" /var/log/nut.log
& stop
:msg,contains,"nut-" /var/log/nut.log
& stop
Это & stop
необходимо для остановки фильтров после того, как будет найдено соответствие. Я считаю, что предпочтительный метод — поместить это в специальный файл, например:/etc/rsyslog.d/0-nut.conf
Но когда я это делаю, фильтры перестают регистрировать данные в /var/log/syslog
, и регистрируют данные исключительно в /var/log/nut.log
... ?
Есть ли другой способ сделать это?
Спасибо!
решение1
Директива $IncludeConfig
or include()
в rsyslog.conf
появляется перед большинством стандартных правил, включая то, которое записывает сообщения в /var/log/syslog
. Если вы добавите свои правила после других правил в этом файле, то сообщения nut уже будут записаны в , syslog
прежде чем они также будут сопоставлены и записаны в nut.log
.
Если вместо этого вы поместите свои правила в отдельный файл, сообщение будет записано в nut.log
, тогда stop
пропустит последующие правила. Ответ — не использовать stop
.
Если проблема в том, что сообщение может содержать как «USB», так и «nut-», и поэтому должно быть записано дважды nut.log
, то вам необходимо использовать более сложный синтаксис.
Устаревший синтаксис был заменен наRainerScriptдавным-давно. Это значит, что можно писать фильтры типа:
if ($msg contains "USB" or $msg contains "nut-") then {
action(type="omfile" file="/var/log/nut.log")
}
Это не обязательно должно препятствовать дальнейшей обработке сообщения.