Ключевые слова:gentoo, linux, syslog, log, cisco, (найти похожие документы)
From: Попов Дмитрий (Inc_Vega) <incvega@gmail.com.>
Newsgroups:
Date: Sun, 6 Oct 2006 17:02:14 +0000 (UTC)
Subject: gentoo & syslog-ng + snmptrapd + postgres
Введение
В данной статье затронут обзор пакетов(etc):
OS-Gentoo - http://www.gentoo.org
NET-SNMP (snmptrapd) http://net-snmp.sourceforge.net
SYSLOG-NG http://www.balabit.com/products/syslog_ng
POSGRESQL http://www.postgresql.org
внешний девайс отдающий трапы:
CISCO-С2950 http://www.cisco.com
WARNING: Статья не претендует на полноту функций, которые читатель
сможет раскрыть после прочения.
1)Настройка CISCO- C2950 для отправки snmp-trap на удаленный хост:
!
logging trap debugging
snmp-server enable traps snmp linkdown linkup
snmp-server host 192.168.0.1 version 2c linkdown
snmp-server host 192.168.0.1version 2c linkdown
snmp-server host 192.168.0.1 version 2c linkdup
snmp-server host 192.168.0.1 version 2c linkup
!
После того как пропишим эти строки на Cisco C2950, будут посылаться
трапы на хост 192.168.0.1 (Посылка трапов будет при падении порта на
свиче, я просто передергивал его командами shutdown , no shutdown) .
Соответственно мы сможем их послушать tcpdump:
root # tcpdump -i eht0 port 162
tcpdump -i eth0 port 162
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes
14:05:30.897468 IP 192.168.0.2.56488 > 192.168.0.1.snmptrap: C=linkdown V2Trap(14
0)system.sysUpTime.0=770988979 [|snmp]
* Если у вас что-то не получилось вам на www.cisco.com
2) Для того что бы принять трапы и чучуть их подразобрать есть пакет
NET-SNMP(в FreeBSD есть по умолчанию кажися)
localhost bin # emerge -pv net-snmp
These are the packages that would be merged, in order:
Calculating dependencies... done!
[ebuild R ] net-analyzer/net-snmp-5.2.1.2-r1 USE="X ipv6 perl ssl tcpd -doc* -elf -lm_sensors -minimal -rpm (-selinux) -smux" 0 kB
Total size of downloads: 0 kB
За вами оставляю выбор ключей установки я деал по дефаулту
добавим скрипт в автозагрузку
# rc-update add snmptrapd default
и стартуем
#/etc/init.d/snmptrapd start (если отругается то создайте чистый конфиг файла в /etc/snmp/snmptrapd.conf)
snmptrapd - Receive and log SNMP trap messages. (передача и логирование трапов)
Для запуска демона в своем режиме прочтите ман или зайдите на сайт
разработчика который находится в начале статьи. У меня демон стартует
вот так: (root# ps -ef)
root 7262 1 0 Sep15 ? 00:00:00 /usr/sbin/snmptrapd -p /var/run/snmptrapd.pid
По умолчанию трапы будут валиться в locale0 в /var/log/messages . Для
отделения от общей кучи можно перевести его на locale0-7 (man snmptrapd)
3)Далее необходимо настроить пакет SYSLOG-NG
Описание процесса инсталяции syslog-ng не буду по причине что он есть
handbook(www.gentoo.org).
Я лишь подправил его следующим образом (согласно
http://ben.muppethouse.com/SYSLOG-DOC.html ) и перестартовал демон :
# $Header: /var/cvsroot/gentoo-x86/app-admin/syslog-ng/files/syslog-ng.conf.gentoo,v 1.5 2005/05/12 05:46:10 mr_bones_ Exp $
#
# Syslog-ng default configuration file for Gentoo Linux
# contributed by Michael Sterrett
options {
chain_hostnames(off);
sync(0);
time_reopen(10);
log_fifo_size(100);
long_hostnames(on);
create_dirs(yes);
time_reap(12);
gc_busy_threshold(768);
# The default action of syslog-ng 1.6.0 is to log a STATS line
# to the file every 10 minutes. That's pretty ugly after a while.
# Change it to every 12 hours so you get a nice daily update of
# how many messages syslog-ng missed (0).
stats(43200);
};
source src { unix-stream("/dev/log"); internal(); pipe("/proc/kmsg"); };
source s_udp { udp(); };
source s_tcp { tcp(); };
source s_local { internal(); };
destination d_local { file("/var/log/syslog-ng.$MONTH"); };
destination d_postgres { file("/spooldir/syslog2pgsql/fulllog.$YEAR.$MONTH.$DAY.$HOUR.$MIN.$SEC"
template("INSERT INTO msg_table VALUES \( '$R_ISODATE', '$S_ISODATE', '$HOST', '$FACILITY', '$PRIORITY', '$MSG'\)\;\n")
template_escape(yes)
owner(postgres));
};
destination authlog { file("/var/log/auth.log"); };
destination syslog { file("/var/log/syslog"); };
destination cron { file("/var/log/cron.log"); };
destination daemon { file("/var/log/daemon.log"); };
destination user { file("/var/log/user.log"); };
destination mail { file("/var/log/mail.log"); };
destination debug { file("/var/log/debug"); };
destination messages { file("/var/log/messages"); };
destination console { usertty("root"); };
destination console_all { file("/dev/tty12"); };
destination xconsole { pipe("/dev/xconsole"); };
filter f_authpriv { facility(auth, authpriv); };
filter f_syslog { not facility(authpriv, mail); };
filter f_cron { facility(cron); };
filter f_daemon { facility(daemon); };
filter f_user { facility(user); };
filter f_messages { level(info..warn)
and not facility(auth, authpriv, mail, news); };
filter f_emergency { level(emerg); };
filter f_info { level(info); };
filter f_notice { level(notice); };
filter f_warn { level(warn); };
filter f_crit { level(crit); };
filter f_err { level(err); };
filter f_failed { match("failed"); };
filter f_denied { match("denied"); };
filter f_postgres { not(
(host("syslog") and facility(cron) and level(info))
or (facility(user) and level(notice)
and ( match(" gethostbyaddr: ")
or match("last message repeated ")
)
)
or ( facility(local3) and level(notice)
and match(" SYSMON NORMAL "))
or ( facility(mail) and level(warning)
and match(" writable directory")
)
or ( ( host("192168.0.1")
or host("192.168.0.1")
)
and facility(auth) and level(info)
and match("su oracle") and match(" succeeded for root on /dev/")
)
); };
log { source(src); filter(f_authpriv); destination(authlog); };
log { source(src); filter(f_syslog); destination(syslog); };
log { source(src); filter(f_cron); destination(cron); };
log { source(src); filter(f_daemon); destination(daemon); };
log { source(src); filter(f_user); destination(user); };
log { source(src); filter(f_messages); destination(messages); };
log { source(src); filter(f_emergency); destination(console); };
log { source(src); source(s_udp); source(s_tcp); filter(f_postgres); destination(d_postgres); };
Я не выпиливал до конца напильником все что, хотел выжать из данной
связки, но думаю конфиг потерпит серьезное изменение но вот как только
заработало решил вам отправить.
4) Работа Posgresql
Для начала создадим базу под это хозяйство syslog-ng (может быть любая):
vega@localhost ~$ createdb syslog-ng
Создание таблицы для куда будет все ссыпаться:
CREATE sequence msg_seq_num;
CREATE TABLE msg_table (
msg_rcv_time timestamp,
msg_sent_time timestamp,
hostname varchar(256),
msg_facility varchar(8),
msg_priority varchar(8),
msg_text varchar(2048),
msg_id integer default nextval('msg_seq_num')
);
А вот и скрипт заточенный для меня внимательно просмотрите его:
#!/bin/bash
#
# run-syslog2pgsql-insert.sh
# 23-April-2002 by Ben Russo
#
# This script makes sure that the syslogs get
# into the database.
# It is designed to be started by CRON periodically.
# I would run it every minute, or at least every
# every few minutes.
#
DATADIR="/spooldir/syslog2pgsql"
WORKDIR="/var/log/syslogsql"
LOGFILE="$WORKDIR/syslog2pgsql-insert.log"
TZ=MSD
export DATADIR WORKDIR TZ
#
# Here we are going to make sure there isn't
# already an instance of run-syslog2pgsql-insert.sh
# that is running.
#
if [ -f $WORKDIR/.syslog2pgsql-insert.pid ]
then
OLDPID=`cat $WORKDIR/.syslog2pgsql-insert.pid`
NUMPROCS=`ps -e | grep $OLDPID | grep run-syslog2 | wc -l`
if [ $NUMPROCS -gt 0 ]
then
exit 0
fi
fi
#
# If this script has run this far then there should
# not be another instance of run-syslog2pgsql-insert.sh
# running, therefore let's make a PID file and do it.
#
echo $$ > $WORKDIR/.syslog2pgsql-insert.pid
#
# Now start an endless loop that looks for control files.
#
while true
do
DATE=`date`
if [ -f $WORKDIR/.insert-die ]
then
echo "=die===== $DATE $WORKDIR/.insert-die file found, exiting." >> $LOGFILE
exit 0
fi
if [ -f $WORKDIR/.insert-restart ]
then
echo "=restart= $DATE $WORKDIR/.insert-restart file found, exiting." >> $LOGFILE
echo "=restart= $DATE Deleteing .insert-restart file." >> $LOGFILE
echo "=restart= $DATE Expecting cron to restart this script." >> $LOGFILE
fi
if [ -f $WORKDIR/.insert-pause ]
then
echo "=pause=== $DATE $WORKDIR/.insert pause file found." >> $LOGFILE
echo "=pause=== $DATE sleeping 3 secs." >> $LOGFILE
sleep 3
else
FILELIST=`find $DATADIR -name "fulllog.2[0-9][0-9][0-9].[0-1][0-9].[0-3][0-9].[0-2][0-9].[0-5][0-9].[0-6][0-9]"`
#sleep 999997 – Не нашел альтернативу на вскидку (тут нужна прога что бы в микросекундах интервал задавать в красной шапке есть по умолчанию кажися)
for i in $FILELIST
do
cat $i | psql -U vega -d syslog-ng >> $LOGFILE 2>&1
DATE=`date`
echo "========= $DATE finished $i" >> $LOGFILE
rm -f $i
done
fi
exit 0
done
Занавес
Заряжаем это хозяйство по Cron раз в минуту:
* * * * * root /etc/syslog-ng/run-syslog2pgsql-insert.sh \
/var/log/syslogsql/syslog2pgsql-insert.log 2>&1
> source src { unix-stream("/dev/log"); internal(); pipe("/proc/kmsg"); };
А в документации: file("/proc/kmsg"); И в примерах к syslog-ng...
Кому верить?