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

Knoppix

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

Аватара пользователя
sunny1983
Сообщения: 357
ОС: GNU/Linux 4.x (Fedora, Debian)
Контактная информация:

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

Сообщение sunny1983 »

Нужно разобраться с демоном логирования в Debian. Подлежит там что-либо настройке или нет.
1.rsyslog и syslog - это одно и тоже или первое - это совершенно особая и по своему настраивающаяся дебиановская фишка?
2.Сам процесс логирования работу компьютера не замедляет?
3.У меня (Debian Squeeze) по умолчанию /etc/rsyslog.conf выглядит следующим образом (закоментированые строки я убрал):

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

$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat
$FileOwner root
$FileGroup adm
$FileCreateMode 0640
$DirCreateMode 0755
$Umask 0022
$IncludeConfig /etc/rsyslog.d/*.conf

auth,authpriv.*            /var/log/auth.log
*.*;auth,authpriv.none        -/var/log/syslog
daemon.*            -/var/log/daemon.log
kern.*                -/var/log/kern.log
lpr.*                -/var/log/lpr.log
mail.*                -/var/log/mail.log
user.*                -/var/log/user.log
mail.info            -/var/log/mail.info
mail.warn            -/var/log/mail.warn
mail.err            /var/log/mail.err
news.crit            /var/log/news/news.crit
news.err            /var/log/news/news.err
news.notice            -/var/log/news/news.notice
*.=debug;\
    auth,authpriv.none;\
    news.none;mail.none    -/var/log/debug
*.=info;*.=notice;*.=warn;\
    auth,authpriv.none;\
    cron,daemon.none;\
    mail,news.none        -/var/log/messages
*.emerg                *
daemon.*;mail.*;\
    news.err;\
    *.=debug;*.=info;\
    *.=notice;*.=warn    |/dev/xconsole

Сообщения ядра идут в kern.log (kern.* -/var/log/kern.log)
В то же время все (*.*) сообщения идут в syslog (*.*;auth,authpriv.none -/var/log/syslog)
Какой смысл в том, чтобы для одних и тех те событий вести сразу несколько логов. Можно ли наоборот, чтобы сообщения ядра (а для него вроде как бы ещё и dmesg есть) писались в разные логи, конкретно я хочу чтобы в отдельный лог писались сообщения брандмауэра, я настроил, чтобы они были с префиксом "iptables"?
4.Можно ли читать логи более удобным способом чем через cat и less?
Спасибо сказали:
Аватара пользователя
sunny1983
Сообщения: 357
ОС: GNU/Linux 4.x (Fedora, Debian)
Контактная информация:

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

Сообщение sunny1983 »

Как тему удалить? Я нечаянно задублировал.
Спасибо сказали:
neol
Сообщения: 600
ОС: Debian Stable
Контактная информация:

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

Сообщение neol »

sunny1983 писал(а):
03.06.2012 21:02
Нужно разобраться с демоном логирования в Debian. Подлежит там что-либо настройке или нет.

http://www.rsyslog.com/doc/manual.html или aptitude install rsyslog-doc

1. Это разные вещи, хотя конфиги syslog можно скормить rsyslog. И "фишка" не чисто дебиановская.

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

sunny1983 писал(а):
03.06.2012 21:02
конкретно я хочу чтобы в отдельный лог писались сообщения брандмауэра, я настроил, чтобы они были с префиксом "iptables"?

Что-то типа

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

if $msg contains 'iptables' then /var/log/iptables

http://www.rsyslog.com/doc/rsyslog_conf_filter.html раздел Expression-Based Filters

4. cat, tail, grep (egrep), less для чтения логов подходят идеально, но если сильно хочется, то http://loganalyzer.adiscon.com/ вполне себе вебморда.
Спасибо сказали:
Аватара пользователя
McSim
Сообщения: 419
Статус: Экспериментатор
ОС: заGNU/Linux Debian
Контактная информация:

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

Сообщение McSim »

Написал материал о rsyslog. Думаю, что большинство ответов на свои вопросы найдешь.
Спасибо сказали:
Аватара пользователя
chitatel
Сообщения: 2063

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

Сообщение chitatel »

McSim писал(а):
22.09.2012 13:42
Написал материал о rsyslog.

Хороший блог, унёс в закладки.

P.S.
Денег не дам. :)
Спасибо сказали:
Аватара пользователя
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU
Контактная информация:

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

Сообщение sash-kan »

chitatel
верните на место, пожалуйста — пусть люди читают·
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
Спасибо сказали:
Prostrelov
Сообщения: 14
ОС: OpenSuS, Deb

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

Сообщение Prostrelov »

День добрый. Подмагните советом где я делаю не так.

cat /etc/rsyslog.conf | grep -v "#" | more

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

...
$template FROMHOSTIP,"%fromhost-ip%"
$template FILENAME,"/var/log/rsyslog/%fromhost-ip%/syslog.log"

$template S324,"S324 syslog %TIMESTAMP:::date-rfc3339% %rawmsg%\n"
$template ZABBIXSERVER,"Zabbix server syslog %TIMESTAMP:::date-rfc3339% %rawmsg%\n"
$template CISTEST,"CISTEST syslog %TIMESTAMP:::date-rfc3339% %rawmsg%\n"

if $fromhost-ip contains '10.85.6.174' then ?FILENAME;S324
& ^/etc/rsyslog/syslog.sh;FROMHOSTIP

if $fromhost-ip contains '127.0.0.1' then ?FILENAME;ZABBIXSERVER
& ^/etc/rsyslog/syslog.sh;FROMHOSTIP

if $fromhost-ip contains '10.85.1.13' then ?FILENAME;CISTEST
& ^/etc/rsyslog/syslog.sh;FROMHOSTIP

поясню.
есть 2 обших шаблона
FROMHOSTIP - служит для того чтобы средствами rsyslog получать айпи адрес источника сообщения и в дальнейшем передавать этот шаблон как параметр для скрипта к которому будет обращаться rsyslog (^/etc/rsyslog/syslog.sh;FROMHOSTIP)
FILENAME - в этот шаблону уходит путь с учётом ip адреса источника сообщения. этим шаблоном мы раскладываем по нужным дирректориям наши логи.

CISTEST,S324,ZABBIXSERVER - это парсящие шаблоны добавляющие некий текст в тело syslog сообщения.

Т.О. когда мы получаем сообщение от одного из известных нам айпишников мы кладём в соответсвующую его айпишнику дирректорию отпарсеный нужным нам образом файл syslog.log
и далее обращаемся к скрипту /etc/rsyslog/syslog.sh передав ему в качестве параметра айпишник с которого пришло сообщение.

cat /etc/rsyslog/syslog.sh

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

#!/bin/bash
FROMHOSTIP=$1
if ! [ -f /var/log/rsyslog/$FROMHOSTIP/syslog.old.log ]
then
        echo "123" > /var/log/rsyslog/$FROMHOSTIP/syslog.old.log
        diff -a /var/log/rsyslog/$FROMHOSTIP/syslog.log /var/log/rsyslog/$FROMHOSTIP/syslog.old.log | cut -d " " -f2-100 | zabbix_sender -z $FROMHOSTIP -p 10051 -i -
        cp /var/log/rsyslog/$FROMHOSTIP/syslog.log /var/log/rsyslog/$FROMHOSTIP/syslog.old.log
fi
diff -a /var/log/rsyslog/$FROMHOSTIP/syslog.log /var/log/rsyslog/$FROMHOSTIP/syslog.old.log | cut -d " " -f2-100 | zabbix_sender -z $FROMHOSTIP -p 10051 -i -
cp /var/log/rsyslog/$FROMHOSTIP/syslog.log /var/log/rsyslog/$FROMHOSTIP/syslog.old.log

суть данного скрипта изначально была в сравнении двух лог файлов, отсылке средствами zabbixsender'a разницы между этими файлами нам на сервер и копированнии новоизменённого лог файла в старый лог файл чтобы в дальнейшем при сранвении вновь поступивших логов мы могли отслыать только разницу между старым и новопришедшим логом.
и скрипт прекрасно отрабатывал пока я не попытался добавить в него проверку на существование старого лог файла (syslog.old.log) который при первом приходе логов разумеется отсуствует.
if ! [ -f /var/log/rsyslog/$FROMHOSTIP/syslog.old.log ] - "если такого файла не существует" то
echo "123" > /var/log/rsyslog/$FROMHOSTIP/syslog.old.log - мы создаём этот файл с любой аброй внутри
и дальше уже отрабатываем разницу, отсылаем её на сервер и замещаем старый лог файл новым.

Но увы что-то отрабатывает не так. В резульатте отправки сообщения в syslog получаем только старый лог файл с текстом 123.

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

nc 127.0.0.1 514 -u <<< "logging from remote"
ls /var/log/rsyslog/127.0.0.1/
drwxrwxr-- 2 root root 4096 Apr 15 16:00 .
drwxr-xr-x 5 root root 4096 Mar 21 09:24 ..
-rw-r--r-- 1 root root    4 Apr 15 16:00 syslog.old.log
cat /var/log/rsyslog/127.0.0.1/syslog.old.log
123


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

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

Сообщение McSim »

День добрый.
Попробую дать несколько советов/комментариев...
Prostrelov писал(а):
15.04.2013 16:02
if $fromhost-ip contains '127.0.0.1' then ?FILENAME;ZABBIXSERVER
& ^/etc/rsyslog/syslog.sh;FROMHOSTIP

Если без "& ^/etc/rsyslog/syslog.sh;FROMHOSTIP", то файл будет создан?
Prostrelov писал(а):
15.04.2013 16:02

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

nc 127.0.0.1 514 -u <<< "logging from remote"

использовать для данной задачи nc - это моветон )))
есть отличный "logger".
Попробуйте его.
Спасибо сказали:
Prostrelov
Сообщения: 14
ОС: OpenSuS, Deb

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

Сообщение Prostrelov »

Нашёл сейчас определённую закономерность.
Если закоментировать строку вызывающую внешний скрипт & ^/etc/rsyslog/syslog.sh;FROMHOSTIP
то файл syslog.log по прежнему не создавался. Проверял я это командой nc -w0 -u127.0.0.1 514 <<< "logging from remote".
Ключ -u у nc соответственно отправляет по UDP сообщение.
При этом если в конфиге rsyslog'a сменить протокол UDP на TCP

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

#$ModLoad imudp
#$UDPServerRun 514
$ModLoad imtcp
$InputTCPServerRun 514

воспользоваться командой nc 127.0.0.1 514 <<< "logging from remote" то файл syslog.log создаётся.
Уйти от UDP я к сожалению не могу, у меня несколько десятков оборудования отдают по UDP syslog.

>есть отличный "logger".
Спасибо, дело в том что мне важно что бы собщение уходило именно с определённого хоста, а в logger'e я такого ключа не нашёл.
Спасибо сказали:
Аватара пользователя
McSim
Сообщения: 419
Статус: Экспериментатор
ОС: заGNU/Linux Debian
Контактная информация:

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

Сообщение McSim »

Prostrelov писал(а):
17.04.2013 09:57
Нашёл сейчас определённую закономерность.
Если закоментировать строку вызывающую внешний скрипт & ^/etc/rsyslog/syslog.sh;FROMHOSTIP
то файл syslog.log по прежнему не создавался. Проверял я это командой nc -w0 -u127.0.0.1 514 <<< "logging from remote".
Ключ -u у nc соответственно отправляет по UDP сообщение.
При этом если в конфиге rsyslog'a сменить протокол UDP на TCP

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

#$ModLoad imudp
#$UDPServerRun 514
$ModLoad imtcp
$InputTCPServerRun 514

воспользоваться командой nc 127.0.0.1 514 <<< "logging from remote" то файл syslog.log создаётся.
Уйти от UDP я к сожалению не могу, у меня несколько десятков оборудования отдают по UDP syslog.

>есть отличный "logger".
Спасибо, дело в том что мне важно что бы собщение уходило именно с определённого хоста, а в logger'e я такого ключа не нашёл.

Давайте тогда начнем с конфига...
1. Покажите полный конфиг. (с включенным imudp и закомментированной & ^/etc/rsyslog/syslog.sh;FROMHOSTIP)
2. Покажите вывод netstat -napu
3. Покажите на всякий случай iptables-save
4. Отправьте сообщение о логировании командой:

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

logger --udp -n 127.0.0.1 -P 514 -p local0.notice  Test message

Будет ли создан соответствующий файл?
Появиться ли данное сообщение, например в /var/log/messages ?
Спасибо сказали:
Prostrelov
Сообщения: 14
ОС: OpenSuS, Deb

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

Сообщение Prostrelov »

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

linux-smjh:/ # netstat -napu
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
udp        0      0 0.0.0.0:162             0.0.0.0:*                           1865/snmptrapd
udp        0      0 0.0.0.0:514             0.0.0.0:*                           401/rsyslogd
udp        0      0 0.0.0.0:34343           0.0.0.0:*                           2192/sntp
udp        0      0 :::69                   :::*                                1151/xinetd
udp        0      0 :::514                  :::*                                401/rsyslogd


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

linux-smjh:/ # cat /etc/rsyslog.conf|grep -v "#" |more

$ModLoad imudp
$UDPServerRun 514
$ModLoad ommysql
$ModLoad immark.so
$MarkMessagePeriod      3600
$ModLoad imuxsock.so
$RepeatedMsgReduction   on
$ModLoad imklog.so
$klogConsoleLogLevel    1
$ActionFileDefaultTemplate RSYSLOG_FileFormat
$IncludeConfig /var/run/rsyslog/additional-log-sockets.conf
$IncludeConfig /etc/rsyslog.d/*.conf

if      ( \
            /* kernel up to warning except of firewall  */ \
            ($syslogfacility-text == 'kern')      and      \
            ($syslogseverity <= 4 /* warning */ ) and not  \
            ($msg contains 'IN=' and $msg contains 'OUT=') \
        ) or ( \
            /* up to errors except of facility authpriv */ \
            ($syslogseverity <= 3 /* errors  */ ) and not  \
            ($syslogfacility-text == 'authpriv')           \
        ) \
then    /dev/tty10
&       |/dev/xconsole

*.emerg                                  :omusrmsg:*

if      ($syslogfacility-text == 'kern') and \
        ($msg contains 'IN=' and $msg contains 'OUT=') \
then    -/var/log/firewall
&       ~

if      ($programname == 'acpid' or $syslogtag == '[acpid]:') and \
        ($syslogseverity <= 5 /* notice */) \
then    -/var/log/acpid
&       ~

if      ($programname == 'NetworkManager') or \
        ($programname startswith 'nm-') \
then    -/var/log/NetworkManager
&       ~

mail.*                                  -/var/log/mail
mail.info                               -/var/log/mail.info
mail.warning                            -/var/log/mail.warn
mail.err                                 /var/log/mail.err

news.crit                               -/var/log/news/news.crit
news.err                                -/var/log/news/news.err
news.notice                             -/var/log/news/news.notice

*.=warning;*.=err                       -/var/log/warn
*.crit                                   /var/log/warn

*.*;mail.none;news.none                 -/var/log/messages

local0,local1.*                         -/var/log/localmessages
local2,local3.*                         -/var/log/localmessages
local4,local5.*                         -/var/log/localmessages
local6,local7.*                         -/var/log/localmessages

$template FROMHOSTIP,"%fromhost-ip%"
$template FILENAME,"/var/log/rsyslog/%fromhost-ip%/syslog.log"

$template S324,"S324 syslog %TIMESTAMP:::date-rfc3339% %rawmsg%\n"
$template ZABBIXSERVER,"Zabbix server syslog %TIMESTAMP:::date-rfc3339% %rawmsg%\n"
$template CISTEST,"CISTEST syslog %TIMESTAMP:::date-rfc3339% %rawmsg%\n"

if $fromhost-ip contains '10.85.6.174' then ?FILENAME;S324
if $fromhost-ip contains '127.0.0.1' then ?FILENAME;ZABBIXSERVER
if $fromhost-ip contains '10.85.1.13' then ?FILENAME;CISTEST


iptables - не используется. все таблицы пустые.

Интересно, logger --udp -n 127.0.0.1 -P 514 -p local0.notice Test message
ни с локального хоста ни с удалённого не создали файл syslog.log
но при этом

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

tail /var/log/messages
2013-04-17T10:54:57+04:00 localhost root: Test message
2013-04-17T10:55:40+04:00 localhost root: Test message
2013-04-17T10:56:57+04:00 10.85.2.42 root: Test message
2013-04-17T10:57:01.864922+04:00 linux-smjh /USR/SBIN/CRON[2408]: (root) CMD (/etc/cron.daily/iperf.sh 10.85.6.173)

выходит сообщения то до хоста доходят, только фильтруются куда-то не туда.
при этом если создать пустой файл /var/log/rsyslog/127.0.0.1/syslog.log в дирректории то через
logger --udp -n 127.0.0.1 -P 514 -p local0.notice Test message сообщения туда исправно падают.
chmod 777 на дирректорию /var/log/rsyslog/127.0.0.1 ничего не дал.

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

 ps -AF|grep syslog
root      2705     1  0 12917  2460   0 11:18 ?        00:00:00 /sbin/rsyslogd -c 5 -f /etc/rsyslog.conf
root      2789  2159  0   729   800   0 11:24 pts/0    00:00:00 grep syslog
Спасибо сказали:
Аватара пользователя
McSim
Сообщения: 419
Статус: Экспериментатор
ОС: заGNU/Linux Debian
Контактная информация:

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

Сообщение McSim »

Prostrelov писал(а):
17.04.2013 11:08

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

if $fromhost-ip contains '10.85.6.174' then ?FILENAME;S324

Попробуй так:

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

if $fromhost-ip contains '127.0.0.1' or $fromhost-ip contains 'localhost' then ?FILENAME
Спасибо сказали:
Аватара пользователя
McSim
Сообщения: 419
Статус: Экспериментатор
ОС: заGNU/Linux Debian
Контактная информация:

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

Сообщение McSim »

Да, и еще я бы запустил rsyslog с ключом -x

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

~ # cat /etc/default/rsyslog
RSYSLOGD_OPTIONS="-c5 -x"
чтобы он хостнеймы не резолвил...
Спасибо сказали:
Prostrelov
Сообщения: 14
ОС: OpenSuS, Deb

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

Сообщение Prostrelov »

>if $fromhost-ip contains '127.0.0.1' or $fromhost-ip contains 'localhost' then ?FILENAME
пробовал, эффет тот же ...
файл не создаётся но в /var/log/messages сообщения валятся

у меня немного другой путь
nano /etc/sysconfig/syslog
RSYSLOGD_OPTIONS="-c5 -x"

но то же не помогло только в /var/log/messages попадают сообщения:

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

2013-04-17T12:45:16.349667+04:00 testytest
2013-04-17T12:45:24.940090+04:00 testytest
2013-04-17T12:46:07.777389+04:00 testytestttttt
2013-04-17T12:46:35+04:00 localhost root: Test message

и судя по логу наверно не стоит применять эту опцию т.к. айпиадреса вообще пропали ...

правда ключа -x почему то я не наблюдаю

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

ps -AF|grep syslog
root      3681     1  0 12917  2448   0 12:44 ?        00:00:00 /sbin/rsyslogd -c 5 -f /etc/rsyslog.conf
root      3779  2159  0   729   800   0 12:51 pts/0    00:00:00 grep syslog


попробовал запустить службу не из скрипта

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

cd /sbin
./rsyslogd -c 5 -x -f /etc/rsyslog.conf

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

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

Сообщение Prostrelov »

Теперь я не очень понимаю логику.
Я вернул конфиг к след виду:

linux-smjh:/ # cat /etc/rsyslog.conf|grep -v "#" |more
$ModLoad imudp
$UDPServerRun 514
$ModLoad ommysql

$template FROMHOSTIP,"%fromhost-ip%"
$template FILENAME,"/var/log/rsyslog/%fromhost-ip%/syslog.log"

$template S324,"S324 syslog %TIMESTAMP:::date-rfc3339% %rawmsg%\n"
$template ZABBIXSERVER,"Zabbix server syslog %TIMESTAMP:::date-rfc3339% %rawmsg%\n"
$template CISTEST,"CISTEST syslog %TIMESTAMP:::date-rfc3339% %rawmsg%\n"

if $fromhost-ip contains '10.85.2.41' then ?FILENAME;S324
& ^/etc/rsyslog/syslog.sh;FROMHOSTIP
if $fromhost-ip contains '127.0.0.1' then ?FILENAME;ZABBIXSERVER
& ^/etc/rsyslog/syslog.sh;FROMHOSTIP
if $fromhost-ip contains '10.85.1.13' then ?FILENAME;CISTEST
& ^/etc/rsyslog/syslog.sh;FROMHOSTIP


стартанул rsyslog руками: /sbin/rsyslog -c5 -x -f /etc/rsyslog.conf
и с машины 10.85.2.41 выполнил logger --udp -n 127.0.0.1 -P 514 -p local0.notice Test message
и сообщение упало в дирректорию /var/log/rsyslog/10.85.2.41/syslog.log
rm *
пробую ещё раз отправить сообщение и уже в этот раз файл не создаётся как не отправляй, хотя
сообщения продолжают исправно валиться в /var/log/messages. И так продолжается до тех пор пока
сервер rsyslog не будет перезапущен. Тогда посланое сообщение с 10.85.2.41 вновь создаёт файл syslog.log
но стоит его удалить как все остальные сообщения этот файл заново не создают.

Как это связано я не могу понять.
Спасибо сказали:
Аватара пользователя
sgfault
Сообщения: 586
Статус: -
Контактная информация:

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

Сообщение sgfault »

Prostrelov писал(а):
17.04.2013 16:03
стартанул rsyslog руками: /sbin/rsyslog -c5 -x -f /etc/rsyslog.conf
и с машины 10.85.2.41 выполнил logger --udp -n 127.0.0.1 -P 514 -p local0.notice Test message
и сообщение упало в дирректорию /var/log/rsyslog/10.85.2.41/syslog.log
rm *
пробую ещё раз отправить сообщение и уже в этот раз файл не создаётся как не отправляй, хотя
сообщения продолжают исправно валиться в /var/log/messages. И так продолжается до тех пор пока
сервер rsyslog не будет перезапущен. Тогда посланое сообщение с 10.85.2.41 вновь создаёт файл syslog.log
но стоит его удалить как все остальные сообщения этот файл заново не создают.

Как это связано я не могу понять.

Я читал тему не очень внимательно, так что если не то, извините :huh:
Вы удалили 'rm *' что? /var/log/rsyslog/10.85.2.41/syslog.log ? Те файл, в который писал rsyslog? Если так, то, как я понимаю, он создаваться и не должен. У rsyslog-а по-прежнему открыт дескриптор старого файла, и он продолжает в него писать, а то, что файла на диске уже нет, он, естественно, заметить не может. Например, вот rsyslog/log files only created on start.

Что касается скрипта, в который вы добавили проверку, то вот такое предположение: если этот скрипт запускается с 'errexit', то может что-то в нем выходит с 1 ? Попробуйте добавить добавить subshell с || true. Как-то так

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

#!/bin/bash
FROMHOSTIP=$1
(
    if ! [ -f /var/log/rsyslog/$FROMHOSTIP/syslog.old.log ]
    then
        echo "123" > /var/log/rsyslog/$FROMHOSTIP/syslog.old.log
        diff -a /var/log/rsyslog/$FROMHOSTIP/syslog.log /var/log/rsyslog/$FROMHOSTIP/syslog.old.log | cut -d " " -f2-100 | zabbix_sender -z $FROMHOSTIP -p 10051 -i -
        cp /var/log/rsyslog/$FROMHOSTIP/syslog.log /var/log/rsyslog/$FROMHOSTIP/syslog.old.log
    fi
    diff -a /var/log/rsyslog/$FROMHOSTIP/syslog.log /var/log/rsyslog/$FROMHOSTIP/syslog.old.log | cut -d " " -f2-100 | zabbix_sender -z $FROMHOSTIP -p 10051 -i -
    cp /var/log/rsyslog/$FROMHOSTIP/syslog.log /var/log/rsyslog/$FROMHOSTIP/syslog.old.log
) || true


Upd.
Или еще можно добавить

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

set -o > /var/log/options.tmp

чтобы посмотреть какие опции включены.
Спасибо сказали:
Аватара пользователя
McSim
Сообщения: 419
Статус: Экспериментатор
ОС: заGNU/Linux Debian
Контактная информация:

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

Сообщение McSim »

sgfault Все верно рассуждает.
Если в скрипте при удалении файла не указать релоад в виде:

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

kill -HUP $(cat /var/run/rsyslogd.pid)

То удаленный файл в файловой системе отображаться не будет, но фактически будет использоваться. Пример:

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

MEDIA ~ # cat  /var/run/rsyslogd.pid
2047
MEDIA ~ # ls -la /proc/2047/fd
итого 0
dr-x------ 2 root root  0 Апр 17 10:25 .
dr-xr-xr-x 8 root root  0 Апр 16 22:54 ..
lrwx------ 1 root root 64 Апр 17 10:25 0 -> socket:[5350]
lrwx------ 1 root root 64 Апр 17 10:25 1 -> anon_inode:[eventpoll]
l-wx------ 1 root root 64 Апр 17 10:25 10 -> /var/log/router.log
l-wx------ 1 root root 64 Апр 17 18:19 11 -> /var/log/kern.log
l-wx------ 1 root root 64 Апр 17 10:25 2 -> /var/log/syslog
lrwx------ 1 root root 64 Апр 17 10:25 3 -> socket:[5338]
l-wx------ 1 root root 64 Апр 17 10:25 4 -> /var/log/messages
lr-x------ 1 root root 64 Апр 17 10:25 5 -> /proc/kmsg
l-wx------ 1 root root 64 Апр 17 10:25 6 -> /var/log/auth.log
lrwx------ 1 root root 64 Апр 17 10:25 7 -> /dev/xconsole
l-wx------ 1 root root 64 Апр 17 10:25 8 -> /var/log/daemon.log
l-wx------ 1 root root 64 Апр 17 10:25 9 -> /var/log/router-emer.log
MEDIA ~ # rm /var/log/messages
rm: удалить обычный файл «/var/log/messages»? y
MEDIA ~ # ls -la /var/log/ | grep mes
-rw-r-----  1 root     adm        44658 Апр 16 22:54 dmesg
-rw-r-----  1 root     adm        44801 Апр 15 18:09 dmesg.0
-rw-r-----  1 root     adm        11807 Апр 12 16:14 dmesg.1.gz
-rw-r-----  1 root     adm        11812 Апр  7 23:29 dmesg.2.gz
-rw-r-----  1 root     adm        11809 Апр  7 13:54 dmesg.3.gz
-rw-r-----  1 root     adm        11814 Апр  6 19:10 dmesg.4.gz
-rw-r-----  1 root     adm        86404 Апр 16 06:25 messages.1
-rw-r-----  1 root     adm       215714 Апр  8 06:25 messages.2.gz
-rw-r-----  1 root     adm       644798 Фев  8 06:25 messages.3.gz
-rw-r-----  1 root     adm       162185 Окт 31 06:25 messages.4.gz
MEDIA ~ # tail /proc/2047/fd/
tail: ошибка чтения «/proc/2047/fd/»: Это каталог
MEDIA ~ # tail /proc/2047/fd/4
Apr 16 22:54:36 MEDIA kernel: [    9.587155] EXT4-fs (sdb1): mounted filesystem with ordered data mode. Opts: (null)
Apr 16 22:54:36 MEDIA kernel: [   11.539638] r8169 0000:01:00.0: eth0: link down
Apr 16 22:54:36 MEDIA kernel: [   11.539647] r8169 0000:01:00.0: eth0: link down
Apr 16 22:54:36 MEDIA kernel: [   11.590936] r8169 0000:03:02.0: eth2: link down
Apr 16 22:54:36 MEDIA kernel: [   11.646996] r8169 0000:03:01.0: eth1: link down
Apr 16 22:54:36 MEDIA kernel: [   13.904255] r8169 0000:01:00.0: eth0: link up
Apr 16 22:54:54 MEDIA squid[3123]: Squid Parent: child process 3125 started
Apr 16 22:59:58 MEDIA kernel: [  335.670735] fuse init (API version 7.17)
Apr 17 06:25:05 MEDIA rsyslogd: [origin software="rsyslogd" swVersion="5.8.11" x-pid="2047" x-info="http://www.rsyslog.com"] rsyslogd was HUPed
Apr 17 10:28:28 MEDIA kernel: [41645.234311] ip_tables: (C) 2000-2006 Netfilter Core Team
MEDIA ~ # logger --udp test
MEDIA ~ # tail /proc/2047/fd/4
Apr 16 22:54:36 MEDIA kernel: [   11.539638] r8169 0000:01:00.0: eth0: link down
Apr 16 22:54:36 MEDIA kernel: [   11.539647] r8169 0000:01:00.0: eth0: link down
Apr 16 22:54:36 MEDIA kernel: [   11.590936] r8169 0000:03:02.0: eth2: link down
Apr 16 22:54:36 MEDIA kernel: [   11.646996] r8169 0000:03:01.0: eth1: link down
Apr 16 22:54:36 MEDIA kernel: [   13.904255] r8169 0000:01:00.0: eth0: link up
Apr 16 22:54:54 MEDIA squid[3123]: Squid Parent: child process 3125 started
Apr 16 22:59:58 MEDIA kernel: [  335.670735] fuse init (API version 7.17)
Apr 17 06:25:05 MEDIA rsyslogd: [origin software="rsyslogd" swVersion="5.8.11" x-pid="2047" x-info="http://www.rsyslog.com"] rsyslogd was HUPed
Apr 17 10:28:28 MEDIA kernel: [41645.234311] ip_tables: (C) 2000-2006 Netfilter Core Team
Apr 17 18:22:10 MEDIA mc-sim: test
MEDIA ~ # ls -la /var/log/ | grep mes
-rw-r-----  1 root     adm        44658 Апр 16 22:54 dmesg
-rw-r-----  1 root     adm        44801 Апр 15 18:09 dmesg.0
-rw-r-----  1 root     adm        11807 Апр 12 16:14 dmesg.1.gz
-rw-r-----  1 root     adm        11812 Апр  7 23:29 dmesg.2.gz
-rw-r-----  1 root     adm        11809 Апр  7 13:54 dmesg.3.gz
-rw-r-----  1 root     adm        11814 Апр  6 19:10 dmesg.4.gz
-rw-r-----  1 root     adm        86404 Апр 16 06:25 messages.1
-rw-r-----  1 root     adm       215714 Апр  8 06:25 messages.2.gz
-rw-r-----  1 root     adm       644798 Фев  8 06:25 messages.3.gz
-rw-r-----  1 root     adm       162185 Окт 31 06:25 messages.4.gz

Как-то так.
Мне показалось странным, что правило
if $fromhost-ip contains '127.0.0.1' then
не срабатывает...

Prostrelov ты перезапускал демон после редактирования конфига?
Спасибо сказали:
Prostrelov
Сообщения: 14
ОС: OpenSuS, Deb

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

Сообщение Prostrelov »

Спасибо огромное за оперативность.

sgfault , почти со всеми понятиями которые вы использовали я не знаком.
в ближайшее время ознакомлюсь с errexit, subshell и пр.
set -o > /var/log/options.tmp
на opensus'e такой файл отсутствует.

McSim , да я перезапускал демон. Похоже я сам себе ставил палки в колёса и с чего-то решил что файл должен пересоздаваться автоматически.
В самом скрипте я rm не вызываю поэтому необходимости в kill -HUP $(cat /var/run/rsyslogd.pid) думаю не будет.
Единственный нюанс который нужно будет выяснить это ротация логов средствами logrotate.
Если в процессе создания архивной копии оригинальный файл не удаляется то думаю конфигурация будет работать.
Ещё раз огромное спасибо за советы и примеры. Задача по сбору syslog'а с активного сетевого оборудования висела уже почти месяц.

Видимо придётся использовать

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

...
create 600 root root
sharedscripts
postrotate
kill -HUP `cat /var/run/rsyslogd.pid`
endscript
}

т.к. copytruncate многие говорят не стабильно работает
Спасибо сказали:
Kopilov
Сообщения: 949
ОС: [K]Ubuntu, Debian

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

Сообщение Kopilov »

На тему очистки лога при запущеном демоне -- у меня возникла такая необходимость при Java EE разработке (при каждом прогоне своей программы хочется иметь чистый лог, а контейнер пишет в один и тот же файловый дескриптор). Перезапуск контейнера длится на порядок дольше переразвёртывания проекта, поэтому для очистки лога без удаления файла я написал микроскрипт:

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

echo -n "" > server.log

Спасибо сказали:
Аватара пользователя
sgfault
Сообщения: 586
Статус: -
Контактная информация:

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

Сообщение sgfault »

Prostrelov писал(а):
18.04.2013 09:15
sgfault , почти со всеми понятиями которые вы использовали я не знаком.
в ближайшее время ознакомлюсь с errexit, subshell и пр.
set -o > /var/log/options.tmp
на opensus'e такой файл отсутствует.


Я имел в виду, что, возможно, в оболочке, выполняющей ваш скрипт, установлена опция 'errexit' (сразу завершать скрипт, если какая-то команда завершилась с >0). Использование subshell-а (круглые скобки) и '|| true' после него фактически выключает 'errexit' для блока внутри subshell-а (хотя формально опция 'errexit' все еще включена).

Что касается 'set -o > /var/log/options.tmp', то я предложил вам добавить эту строчку в скрипт, чтобы посмотреть какие опции оболочки включены ('set -o' показывает список опций и их текущие значения, а на месте файла /var/log/options.tmp может быть любой - просто туда записывается результат 'set -o').

И, честно говоря, я так и не понял: так ваш скрипт (из #7 поста) заработал? И в чем же было дело?
Спасибо сказали:
Prostrelov
Сообщения: 14
ОС: OpenSuS, Deb

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

Сообщение Prostrelov »

скрипт работал изначально.
просто я не учёл тот нюанс что удаляя файл syslog.log демону rsyslodg требуется перечитывать конфиг чтобы вновь создать syslog.log файл
Спасибо сказали:
Prostrelov
Сообщения: 14
ОС: OpenSuS, Deb

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

Сообщение Prostrelov »

День добрый. Снова требуется помощь людей более сведущих в скриптах и bash\sh\py.
Пытаюсь перенаправить логи из nginx в syslog через FIFO pipe.
С access_log'ом разобрался.
А вот с error_log'ом беда.
Дело в том что в конфиге nginx.conf не допустимо повторное использование директивы error_log.
То-есть указать путь для error_log можно только 1н раз, в отличии от access_log.
Мне же нужно чтоб сообщения оставались в syslog'e и локально на машине и уходили на удалённый rsyslog-сервер.

Для примера вот так реализован access_log:

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

mkfifo /home/dmzfifo

cat /etc/nginx/nginx.conf
 access_log  /var/log/nginx/access.log  main; #это пишется лог локально
 access_log  /home/dmzfifo  main; #это пишется лог в наш пайп и уходит в сислог а дальше с syslogd на удалённый rsyslog

cat /etc/rc.d/dmzfifo.sh
 #!/bin/bash
 while true
 do
 logger -p local0.notice -f /home/dmzfifo
 done

скрипт с бесконечным циклом висит демоном и как только падает в фифо сообщение отправляет его в сислог.

я пытался поправить скрипт для error_log след образом:

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

mkfifo /home/dmzfifo_error

cat /etc/nginx/nginx.conf
error_log  /home/dmzfifo_error; #можем указать только 1н раз директиву поэтому указываем только наш пайп


cat /etc/rc.d/dmzfifo_error.sh
 #!/bin/bash
 while true
 do
 logger -p local1.notice -f /home/dmzfifo
 cat /home/dmzfifo_error > /var/log/nginx/error.log
 done

но в результате лог идёт только в syslog. я ошибся в логике или в синтаксисе ?
Помогите с решением такой задачи. Может есть решение проще.

п.с.
на всякий случай поинтересуюсь : умеет ли rsyslog забирать логи.
ресурс находиться в dmz а rsyslog server в сети. может быть есть какой-нибудь модуль.
Спасибо сказали:
Аватара пользователя
sgfault
Сообщения: 586
Статус: -
Контактная информация:

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

Сообщение sgfault »

Prostrelov писал(а):
07.05.2013 11:50

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

mkfifo /home/dmzfifo_error

cat /etc/nginx/nginx.conf
error_log  /home/dmzfifo_error; #можем указать только 1н раз директиву поэтому указываем только наш пайп


cat /etc/rc.d/dmzfifo_error.sh
 #!/bin/bash
 while true
 do
 logger -p local1.notice -f /home/dmzfifo
 cat /home/dmzfifo_error > /var/log/nginx/error.log
 done

но в результате лог идёт только в syslog. я ошибся в логике или в синтаксисе ?

Я думаю, причина в '>' : вам ведь нужно дописывать в конец файла, а не перезаписывать его каждый раз. Те, строчка с `cat` должна быть такой:

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

 cat /home/dmzfifo_error >> /var/log/nginx/error.log
Спасибо сказали:
Аватара пользователя
McSim
Сообщения: 419
Статус: Экспериментатор
ОС: заGNU/Linux Debian
Контактная информация:

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

Сообщение McSim »

Prostrelov писал(а):
07.05.2013 11:50
<...>я пытался поправить скрипт для error_log след образом:

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

mkfifo /home/dmzfifo_error

cat /etc/nginx/nginx.conf
error_log  /home/dmzfifo_error; #можем указать только 1н раз директиву поэтому указываем только наш пайп


cat /etc/rc.d/dmzfifo_error.sh
 #!/bin/bash
 while true
 do
 logger -p local1.notice -f /home/dmzfifo
 cat /home/dmzfifo_error > /var/log/nginx/error.log
 done
<...>

я вот этот момент не совсем понял...
сначала указан mkfifo /home/dmzfifo_error
а в скрипте logger -p local1.notice -f /home/dmzfifo
Не ошибка ли это?
Спасибо сказали:
Аватара пользователя
McSim
Сообщения: 419
Статус: Экспериментатор
ОС: заGNU/Linux Debian
Контактная информация:

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

Сообщение McSim »

В общем, еще пару дополнений...
1. мне не совсем понятно назначение строки logger -p local1.notice -f /home/dmzfifo
в скрипте для лога ошибок.
2. Не создает ли скрипт нагрузку на хост? я бы поставил sleep 1-2 секунды после/перед logger
3. во избежании ошибок и неточностей я бы использовал полные пути к cat и logger.
Спасибо сказали:
Prostrelov
Сообщения: 14
ОС: OpenSuS, Deb

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

Сообщение Prostrelov »

sqfault, спасибо, каждый раз для себя открываю новые особенности sh.

McSlim, по поводу mkfifo - это опечатка на форуме. в рабочем конфиге прописан fifo правильно.

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

logger -p local1.notice -f /home/dmzfifo

здесь /home/dmzfifo это область содержащая сообщение а т.к. это FIFO pipe то вместо пути подставляется само текстовое сообщения от
приложения пишушего в FIFO pipe, таким образом как только что-то падает в пайп логер это что-то отправляет локальному же хосту в syslog.
так мы завернули обычный текстовый лог в локальный сислог, а локальный сислог уже буде по syslog.conf раскладывать лог в локальную папку и на удалённый rsyslog сервер.

п.с.
в данный момент мы избавились от необходимости создавать пайпы и отсылать через syslogd логи на rsyslog сервер.
решение более простое подключить дирректорию с логами сайта через sshfs к rsyslog серверу и через модуль imfile.co читать эту шару.
Спасибо сказали:
Аватара пользователя
McSim
Сообщения: 419
Статус: Экспериментатор
ОС: заGNU/Linux Debian
Контактная информация:

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

Сообщение McSim »

И все же, не ясно, что соответствует реальности?
Так:

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

mkfifo /home/dmzfifo_error

cat /etc/nginx/nginx.conf
error_log  /home/dmzfifo_error; #можем указать только 1н раз директиву поэтому указываем только наш пайп


cat /etc/rc.d/dmzfifo_error.sh
 #!/bin/bash
 while true
 do
 logger -p local1.notice -f /home/dmzfifo_error
 cat /home/dmzfifo_error > /var/log/nginx/error.log
 done

или так:

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

mkfifo /home/dmzfifo_error

cat /etc/nginx/nginx.conf
error_log  /home/dmzfifo_error; #можем указать только 1н раз директиву поэтому указываем только наш пайп


cat /etc/rc.d/dmzfifo_error.sh
 #!/bin/bash
 while true
 do
 logger -p local1.notice -f /home/dmzfifo
 cat /home/dmzfifo > /var/log/nginx/error.log
 done

или как-то по другому...
Если первый случай, то тогда возникает встречный вопрос: т.к. logger -p local1.notice -f /home/dmzfifo_error уже прочитает из dmzfifo_error сообщения, то команда cat /home/dmzfifo_error > /var/log/nginx/error.log их там уже не обнаружит.
Если второй, то какой смысл читать из /home/dmzfifo ?

Ну это я спросил так... Чтобы логически завершить итерацию обсуждения )
Спасибо сказали:
Аватара пользователя
sgfault
Сообщения: 586
Статус: -
Контактная информация:

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

Сообщение sgfault »

McSim писал(а):
08.05.2013 15:41
И все же, не ясно, что соответствует реальности?
[..]
Если первый случай, то тогда возникает встречный вопрос: т.к. logger -p local1.notice -f /home/dmzfifo_error уже прочитает из dmzfifo_error сообщения, то команда cat /home/dmzfifo_error > /var/log/nginx/error.log их там уже не обнаружит.
Если второй, то какой смысл читать из /home/dmzfifo ?

Ну это я спросил так... Чтобы логически завершить итерацию обсуждения )

Хоть вопрос был и не ко мне, я все же напишу, как я это понял. В сообщении #22 Prostrelov писал:
Prostrelov писал(а):
07.05.2013 11:50
Для примера вот так реализован access_log:

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

mkfifo /home/dmzfifo

cat /etc/nginx/nginx.conf
 access_log  /var/log/nginx/access.log  main; #это пишется лог локально
 access_log  /home/dmzfifo  main; #это пишется лог в наш пайп и уходит в сислог а дальше с syslogd на удалённый rsyslog

те /home/dmzfifo - это access_log. И далее
Prostrelov писал(а):
07.05.2013 11:50
я пытался поправить скрипт для error_log след образом:
[code]mkfifo /home/dmzfifo_error

cat /etc/nginx/nginx.conf
error_log /home/dmzfifo_error; #можем указать только 1н раз директиву поэтому указываем только наш пайп

те /home/dmzfifo_error - это error_log.

Поэтому, как я понял, ни один из ваших вариантов не правильный. Хотя, мне кажется, во втором своем варианте вы ошиблись и хотели написать не два раза /home/dmzfifo, а то же, что написал Prostrelov в сообщении #22. И, как я понимаю, именно это и есть правильный вариант (те fifo два: один - для access_log, один - для error_log).
Спасибо сказали:
Prostrelov
Сообщения: 14
ОС: OpenSuS, Deb

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

Сообщение Prostrelov »

Да уж опечатка не вовремя проскочила.
Вот какой конфиг является рабочим:

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

mkfifo /home/dmzfifo_error
mkfifo /home/dmzfifo_access

cat /etc/nginx/nginx.conf
 error_log  /home/dmzfifo_error;
 access_log  /var/log/nginx/access.log  main;
 access_log  /home/dmzfifo_access  main;

cat /etc/rc.d/dmzfifo_error.sh
 #!/bin/bash
 while true
 do
 logger -p local1.notice -f /home/dmzfifo_error
 cat /home/dmzfifo_error > /var/log/nginx/error.log
 done

cat /etc/rc.d/dmzfifo_access.sh
 #!/bin/bash
 while true
 do
 logger -p local1.notice -f /home/dmzfifo_access
 done


Я тоже боюсь что один раз вычитав FIFO pipe в logger дойдя дальше по скрипту к CAT скрипту нечего будет читать.
Если это действительно так то хотелось бы узнать как это обойти.
Спасибо сказали:
Аватара пользователя
sgfault
Сообщения: 586
Статус: -
Контактная информация:

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

Сообщение sgfault »

Prostrelov писал(а):
08.05.2013 17:08
Я тоже боюсь что один раз вычитав FIFO pipe в logger дойдя дальше по скрипту к CAT скрипту нечего будет читать.
Если это действительно так то хотелось бы узнать как это обойти.

Вот, например, есть два таких варианта.

Попробовать создать второй fifo для logger-а, и с помощью tee отправлять копию текста туда (измените пути, так как нужно):

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

#!/bin/sh

set -euf

mkfifo ./pipe_logger || true

while true; do
    tee ./pipe_logger <./dmzfifo_error >> ./error.log &
    logger -p local1.notice -f ./pipe_logger
    wait
done


Или можно сказать logger-у отправлять копию на stderr, и использовать ее для записи в error.log:

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

#!/bin/sh

set -euf

while true; do
    logger -s -p local1.notice -f ./dmzfifo_error >> ./error.log 2>&1
done


Upd.
'wait' в первом примере, наверно, не нужен. Он точно может все повесить (см. сообщение 32). А может ли пойти что-то не так, если его нет, получается, я сказать не могу.
Спасибо сказали:
Ответить