Настраиваем rsyslog

Knoppix

Модераторы: Warderer, Модераторы разделов

Prostrelov
Сообщения: 14
ОС: OpenSuS, Deb

Re: Настраиваем rsyslog

Сообщение Prostrelov »

sgfault, а вы не могли бы прокомментировать эту строку:

Код: Выделить всё

tee /etc/rsyslog/pipe_logger </etc/rsyslog/dmzfifo_error >> /var/log/nginx/error.log &

я что-то никак не могу уловить что в ней происходит. я заранее добавил в неё пути что бы не смущало обращение к пайпам как к скриптам через "./".
По тем манам что находил у tee синтаксис довольно простой: tee [ПАРАМЕТР] [ФАЙЛ]. Параметры мы не использовали. Но видимо использовали ряд перенаправлений.
По этому что бы не гадать хотелось бы услышать что мы и как перенаправляем <>> такими символами.
п.с.
так же не смог найти информации по set -euf
Спасибо сказали:
Аватара пользователя
sgfault
Сообщения: 586
Статус: -

Re: Настраиваем rsyslog

Сообщение sgfault »

Prostrelov писал(а):
13.05.2013 09:46
sgfault, а вы не могли бы прокомментировать эту строку:

Код: Выделить всё

tee /etc/rsyslog/pipe_logger </etc/rsyslog/dmzfifo_error >> /var/log/nginx/error.log &

я что-то никак не могу уловить что в ней происходит. я заранее добавил в неё пути что бы не смущало обращение к пайпам как к скриптам через "./".
По тем манам что находил у tee синтаксис довольно простой: tee [ПАРАМЕТР] [ФАЙЛ]. Параметры мы не использовали. Но видимо использовали ряд перенаправлений.
По этому что бы не гадать хотелось бы услышать что мы и как перенаправляем <>> такими символами.

Как вы, видимо, уже прочитали, tee читает из стандартного ввода (stdin) и пишет в стандартный вывод (sdout) и в файл, переданный как аргумент командной строки. Теперь осталось лишь найти, что есть что.
'/etc/rsyslog/pipe_logger' - это файл, в который пишет tee (в данном примере - пайп),
'</etc/rsyslog/dmzfifo_error' - это перенаправление стандартного ввода (stdin) на ввод из файла (в данном случае тоже пайп),
'>> /var/log/nginx/error.log' - это перенаправление стандартного вывода (stdout) в файл.
'&' - запуск команды в background (асинхронно).

На самом деле в этом примере есть более интересная вещь - wait. Точнее, сейчас я понял, что не могу объяснить зачем он нужен, и уже не уверен нужен ли вообще. Если пайп dmzfifo_error читает только один процесс (допустим, tee), то разницы есть он или нет не должно быть никакой: tee в background-е ждет, когда что-то появится в dmzfifo_error, а logger ждет пока что-то появится в pipe_logger. Когда что-то появляется в dmzfifo_error, tee все это читает, отправляет в error.log и pipe_logger и завершается, logger, соответственно, читает pipe_logger и тоже завершается и цикл продолжается.

Но если по каким-либо причинам dmzfifo_error читает несколько процессов (допустим, того же tee), то все становится намного интереснее. Сообщения из пайпа, как я понимаю, достанутся кому-то одному. Если в цикле стоит wait, то цикл будет ждать именно тот процесс, который он запустил, и если сообщения достанутся другому, то скрипт зависнет навсегда, тк даже если нужный tee успеет прочесть позже какое-то сообщение, он не завершится до тех пор, пока logger не прочитает из pipe_logger. А этого не произойдет, тк logger с этого прохода цикла уже отработал (использовав результат другого tee, который тоже писал в pipe_logger).

Те, если мое рассуждение правильное, wait может все повесить. Но в тот раз.. в тот раз я его добавил потому, что каким-то образом у меня получился цикл, который не останавливался: он запускал все больше и больше процессов. Сейчас я не могу это воспроизвести. Может, это было из-за какой-то другой ошибки, но тогда я исправил все wait-ом. В общем, тут чего-то не хватает :huh:

Prostrelov писал(а):
13.05.2013 09:46
п.с.
так же не смог найти информации по set -euf

'set' - это встроенная команда shell. Я просто включаю некоторые опции, которые, я считаю, стоит включать для предотвращения последствий возможных ошибок:
-e - это 'errexit'. Завершение скрипта, если какая-то команда завершилась не с 0.
-u - это 'nounset'. Считать переменные без значения (это _не_ то же самое, что пустое значение) ошибкой. Разницу между пустым значением и отсутсвием значения можно увидеть на примере:

Код: Выделить всё

$ ( set -u; echo v=$v )
-bash: v: unbound variable
$ ( set -u; v=''; echo v=$v )
v=

первая команда завершилась ошибкой, вторая - нет.
-f - это 'noglob'. Отключение pathname expansion (подстановка имен файлов вместо * и тд). Иногда, может сработать там, где вы этого совсем не ждете. Поэтому я всегда отключаю, кроме тех случаев, когда точно знаю, зачем мне это нужно.

Спасибо сказали:
Prostrelov
Сообщения: 14
ОС: OpenSuS, Deb

Re: Настраиваем rsyslog

Сообщение Prostrelov »

Временами sh\bash напоминает картины маслом. Смотришь в упор - ничего не видно. Стоит отойти и становиться понятно.
То-есть конструкция с tee как бы разделяется на несколько логических блоков:
[ ( tee /etc/rsyslog/pipe_logger ) < /etc/rsyslog/dmzfifo_error ] >> /var/log/nginx/error.log
чем-то по конструкции схоже с импортом дампа в mysql: mysql -u root -p < 123.sql

Спасибо, за примеры и пояснения.
Очень интересные тонкости использования bash.
Спасибо сказали:
Prostrelov
Сообщения: 14
ОС: OpenSuS, Deb

Re: Настраиваем rsyslog

Сообщение Prostrelov »

Столкнулся со странной ситуацией.
Имеется машина с syslogd
*.info;mail.none;news.none;authpriv.none;cron.none /var/log/messages
*.info;mail.none;news.none;authpriv.none;cron.none @192.168.0.11


И машина с rsyslogd
$ModLoad imudp
$UDPServerRun 514

if $hostname contains '192.168.0.3' and (($syslogfacility-text contains 'auth' and $syslogpriority-text contains 'info') or ($syslogfacility-text contains 'auth' and $syslogpriority-text contains 'err') or ($syslogfacility-text contains 'authpriv' and $syslogpriority-text contains 'info')) then /var/log/rsyslog/10.85.6.175/auth.log

if $hostname contains '192.168.0.3' and (($syslogpriority-text contains 'notice') or ($syslogfacility-text contains 'kern' and $syslogpriority-text contains 'debug') or ($syslogfacility-text contains 'lpr' and $syslogpriority-text contains 'info') or ($syslogfacility-text contains 'mail' and $syslogpriority-text contains 'crit')) then /var/log/rsyslog/10.85.6.175/messages


При этом почему-то rsyslog пишет приходящие сообщения во все файлы (и в auth и в message).

Пробуем дебаг
rsyslogd -c5 -dn > /home/logfile
видим следующие строки

8010.621373944:8a299100: recv(5,182)/192.168.0.3,acl:1,msg:<4>kernel: IN=eth0 OUT= MAC=00:21:5a:e0:e2:69:20:20:20:20:20:10:08:00 SRC=192.168.1.2 DST=192.168.0.3 LEN=58 TOS=0x00$
8010.621443227:8a299100: main Q: entry added, size now 1 entries
8010.621475913:8a299100: wtpAdviseMaxWorkers signals busy
8010.621510275:8a299100: main Q: EnqueueMsg advised worker start
8010.621559722:8a299100: Listening on UDP syslogd socket 4 (IPv6/port 514).
8010.621593246:8a299100: Listening on UDP syslogd socket 5 (IPv4/port 514).
8010.621619227:8a299100: --------imUDP calling select, active file descriptors (max 5): 4 5
8010.622029894:8a299600: main Q: entry deleted, state 0, size now 0 entries
8010.622075430:8a299600: dropped LF at very end of message (DropTrailingLF is set)
8010.622104484:8a299600: msg parser: flags 30, from '192.168.0.3', msg '<4>kernel: IN=eth0 OUT= MAC=00:21:5a:e0:e2:69:20:20:20:20:20:10:08:00 SRC=192.168.1.2 DST=192.168.0.3 LE$
8010.622129348:8a299600: Message has legacy syslog format.
8010.622276573:8a299600: result of expression evaluation: 1
8010.622313170:8a299600: Called action, logging to builtin-file
8010.622358986:8a299600: file to log to: /var/log/rsyslog/192.168.0.3/auth.log
8010.622387761:8a299600: doWrite, pData->pStrm 0x8a299e00, lenBuf 224
8010.622418211:8a299600: strm 0x8a299e00: file 3(auth.log) flush, buflen 224
8010.622472967:8a299600: strm 0x8a299e00: file 3 write wrote 224 bytes
8010.622634161:8a299600: result of expression evaluation: 1
8010.622672433:8a299600: Called action, logging to builtin-file
8010.622707913:8a299600: file to log to: /var/log/rsyslog/192.168.0.3/messages
8010.622735291:8a299600: doWrite, pData->pStrm 0x8a299a00, lenBuf 224
8010.622764065:8a299600: strm 0x8a299a00: file 6(messages) flush, buflen 224
8010.622805691:8a299600: strm 0x8a299a00: file 6 write wrote 224 bytes
8010.622844802:8a299600: main Q:Reg/w0: worker IDLE, waiting for work.
8016.785553470:8a299100: CmpHost returns 0


Почему вместо распределения сообщения в соответствующий файл rsyslog пишет его в каждый файл - непонятно.
Сам rsyslog запущен со след ключами
/usr/local/sbin/rsyslogd -c5 -4 -x -f /etc/rsyslog.conf -i /var/run/rsyslog.pid

Складывается ощущение что rsyslog не умеет парсить сообщения от syslogd и не видит facility
Спасибо сказали:
Prostrelov
Сообщения: 14
ОС: OpenSuS, Deb

Re: Настраиваем rsyslog

Сообщение Prostrelov »

Разобрались, в конфиге были следующие ошибки:
RainerScript не понимает (!)contains. Его следует заменять конструкцией not.
Блок условий для входящих сообщений syslog нужно размещать раньше блока для локальных сообщений
и в обязательном порядке экранировать символами каждое правило

Прежде чем стартовать rsyslog в дебаг режиме
Проверяйте конфиг: rsyslogd -c4 -N 2
Спасибо сказали:
Аватара пользователя
McSim
Сообщения: 419
Статус: Экспериментатор
ОС: заGNU/Linux Debian

Re: Настраиваем rsyslog

Сообщение McSim »

Prostrelov
спасибо за описанный результат.
Раз уж тут пошла беседа о rsyslog, то и я поделюсь своей проблемой. При тесте конфига/перезапуске демона я получаю ошибку Could not find template 'LogForm' - action disabled.
Задача: модифицировать сообщения, согласно заданному template
Исходные данные:
задал $template для сетевого оборудования (man)

Код: Выделить всё

SRV-SEC-MON-1-TEST ~ # grep -A1 -B1 templ /etc/rsyslog.conf
#$template       cisco2,"testmess"
$template       cisco, "/var/log/cisco/hosts/%hostname%.log"
$template       LogForm, "123 %msg%"

Создаю правила (man)

Код: Выделить всё

SRV-SEC-MON-1-TEST ~ # grep -A1 -B2  local1 /etc/rsyslog.conf
#*.*    /var/log/cisco/all123.log
local1.*        ?cisco;LogForm
&       /var/log/cisco/all.log
&~

проверяю конфиг - ошибка:

Код: Выделить всё

SRV-SEC-MON-1-TEST ~ # rsyslogd -f /etc/rsyslog.conf -N9 -c4
rsyslogd: version 4.6.4, config validation run (level 9), master config /etc/rsyslog.conf
rsyslogd:  Could not find template 'LogForm' - action disabled
 [try http://www.rsyslog.com/e/3003 ]
rsyslogd: the last error occured in /etc/rsyslog.conf, line 62:"local1.*        ?cisco;LogForm"
rsyslogd: CONFIG ERROR: could not interpret master config file '/etc/rsyslog.conf'. [try http://www.rsyslog.com/e/2124 ]

удаляю local1.* ?cisco;LogForm, при этом,

Код: Выделить всё

 $template       cisco, "/var/log/cisco/hosts/%hostname%.log"

отрабатывает отлично.

вообще ничего не пойму. :huh:
я в ступоре...

Если задаю вот так, то тоже все корректно отрабатывает:

Код: Выделить всё

SRV-SEC-MON-1-TEST ~ # grep -A1 -B2  local1 /etc/rsyslog.conf
#*.*    /var/log/cisco/all123.log
local1.*        ?cisco;RSYSLOG_FileFormat
&       /var/log/cisco/all.log
&~
SRV-SEC-MON-1-TEST ~ # rsyslogd -f /etc/rsyslog.conf -N9 -c4
rsyslogd: version 4.6.4, config validation run (level 9), master config /etc/rsyslog.conf
rsyslogd: End of config validation run. Bye.


Может у кого-то есть идеи...
Спасибо сказали:
uaradio
Сообщения: 16
ОС: Debian

Re: Настраиваем rsyslog

Сообщение uaradio »

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

Nov 24 06:25:08 debian rsyslogd: [origin software="rsyslogd" swVersion="5.8.11" x-pid="1913" x-info="http://www.rsyslog.com"] rsyslogd was HUPed

Как это сообщение убрать и куда копать?
Спасибо сказали:
Аватара пользователя
McSim
Сообщения: 419
Статус: Экспериментатор
ОС: заGNU/Linux Debian

Re: Настраиваем rsyslog

Сообщение McSim »

uaradio писал(а):
24.11.2013 17:06
подскажите в логах каждый день в одно и тоже время сыпет такое...

Nov 24 06:25:08 debian rsyslogd: [origin software="rsyslogd" swVersion="5.8.11" x-pid="1913" x-info="http://www.rsyslog.com"] rsyslogd was HUPed

Как это сообщение убрать и куда копать?

Если ты заглянешь в файл конфига планировщика,

Код: Выделить всё

MEDIA ~ # grep daily /etc/crontab
25 6    * * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )

то увидишь, что каждый дегь запускается задание из /etc/cron.daily.
одно из которых logrotate, который отвечает за ротацию логов:

Код: Выделить всё

MEDIA ~ # ls -la /etc/cron.daily/ | grep log
-rwxr-xr-x  1 root root    89 Апр 18  2010 logrotate

MEDIA ~ # cat /etc/cron.daily/logrotate
#!/bin/sh

test -x /usr/sbin/logrotate || exit 0
/usr/sbin/logrotate /etc/logrotate.conf

logrotgate отвечает за ротацию в том числе файлов rsyslog, при этом выполняет после ротации некоторую команду invoke-rc.d rsyslog rotate > /dev/null

Код: Выделить всё

MEDIA ~ # cat /etc/logrotate.d/rsyslog
/var/log/syslog
{
        rotate 7
        daily
        missingok
        notifempty
        delaycompress
        compress
        postrotate
                invoke-rc.d rsyslog rotate > /dev/null
        endscript
}

/var/log/mail.info
/var/log/mail.warn
/var/log/mail.err
/var/log/mail.log
/var/log/daemon.log
/var/log/kern.log
/var/log/auth.log
/var/log/user.log
/var/log/lpr.log
/var/log/cron.log
/var/log/debug
/var/log/messages
{
        rotate 4
        weekly
        missingok
        notifempty
        compress
        delaycompress
        sharedscripts
        postrotate
                invoke-rc.d rsyslog rotate > /dev/null
        endscript
}

собственно, rotate - это послать демону rsyslog сигнал SIGHUP. Этот сигнал говорит демону перечитать Файл конфигурации и закрыть ранее используемые файлы логов (который стали архивами) и создать новые.
То сообщение, которое попадает в лог нам говорит, что logrotate вместе с rsyslog удачно завершили ротацию лога. Это сообщение чисто для информации и не несет в себе опасности.
Как-то так.
Спасибо сказали:
sambora
Сообщения: 2

Re: Настраиваем rsyslog

Сообщение sambora »


Спецы, гляньте, пожалуйста, по родственной теме сюда...

Запуск скрипта по событию в rsyslog

Это чтобы не плодить ветки... Может есть ответ?
Спасибо сказали: