syslog-ng log server安裝說明
一、syslog-ng的特異功能
經常check system event一直是系統管理上很容易被忽略的重要細節,原因在於大部分的system logs傳達的資訊是不重要的,以至於將重要的警訊淹沒。
如同syslog-ng的名稱,它是用以取代syslogd的next generation版本,原來的syslog是只能夠依priority及facility作分類,syslog-ng可以根據log的內容,以regular expression自訂分類及log的處理方式,並且支援以tcp/udp將log送到遠端的server,或是即時通知在線上的系統管理者,甚至能將log值當成某個program的標準輸入字串,直接將log作加工及分析。
二、安裝syslog-ng
請至
http://www.balabit.hu/en/downloads/syslog-ng/downloads/ 下載syslog-ng及libol,版本有分1.4.x的stable version及1.5.x的development version,如果有打算將log直接輸入資料庫者,必須選擇1.5.x的版本。(p.s:syslog-ng的contrib裡針對不同的OS有不同的conf檔,我是用Red Hat 8.0)
(1)首先,請先關掉syslog避免他再重新開機時自動啟動造成衝突。
chkconfig --level 2345 syslog off
(2)安裝libol,依序下configure、make、make install指令
(3)解壓縮、安裝syslog-ng,依序下configure、make、make install指令
(4)安裝config scripts及設定系統
cp contrib/init.d.RedHat7.3 /etc/rc.d/init.d/syslog-ng
還有修改INIT_PROG = “/usr/local/sbin/syslog-ng”
然後執行以下指令(先在/usr/local/etc/下建一目錄syslog-ng)
cp contrib/syslog-ng.conf.RedHat /usr/local/etc/syslog-ng/syslog-ng.conf
chkconfig --level 2345 syslog-ng on
(5)最後測試看看
/etc/rc.d/init.d/syslog-ng start
(6)檢驗看看有沒有run
chkconfig –list
看看有沒有syslog-ng,且level 2,3,4,5是否標示為開啟
ps aux | grep syslog-ng
看看有沒有syslog-ng的deamon
三、syslog-ng的應用與範例
Syslog-ng的message path全部在syslog-ng.conf作編輯。在syslog-ng的message path中,可以包括多個sources、多個filter rules及多個destinations的同步多工處理。一般來說,採用syslog-ng最大的用途除了運用它分類的功能外,就是運用它的網路功能。如前所提,syslog-ng可以透過tcp或是udp的協定將log送到遠端的server作集中式的監控。
現在我們先假設一個情境,我們希望將幾台提供網路服務的server的log集中到一台server作管理,我們希望能夠將log值中含有特定facility code或特定priority的log儲存在本地端,並且將所有收集到的log值全部送到log server作分類以及儲存。原來的syslog做不到這麼多點,所以我們必須在每一台server安裝syslog-ng,各透過tcp送到log server,log server的syslog-ng.conf依server.conf的範例設定。詳細的syslog-ng config參數當然不只這些,實際設計系統時最好直接看看官方網站的reference manual (
http://www.balabit.hu/static/syslog-ng/ ... book1.html ) 。
server.conf
#設定options,語法為options { S1 ; S2 ; S3…};
#options主要是對整個configuration的共通設定
options { use_fqdn(yes); keep_hostname(yes); use_dns(yes); long_hostnames(off); sync(3); log_fifo_size(300); };
#設定input來源,語法為source source_ name {S1 ; S2 ; …};
#internal()表所有本機產生的log
# unix-stream("/dev/log")表來自本機的log檔,本機是Linux,若為BSD則需用
#unix-dgram,這是開啟一個AF_UNIX socket聽取目的檔案的message.
#收集本地端以及來自192.168.0.100 port 514這台server送來的log值,
#keep-alive(yes/no)決定是否保持連線直到收到sighup訊號
source src { unix-stream("/dev/log"); internal(); };
source remote { tcp(ip("127.0.0.100") port(514) keep-alive(yes)); };
#設定output目的地,語法為destination destination_ name {S1 ; S2 ; …};
#file(“path”):以檔案的方式存在local端
#usertty(“user_name”):即時通知特定的線上的使用者
destination lpr { file("/var/log/lpr.log"); };
destination mail { file("/var/log/mail.log"); };
destination messages { file("/var/log/messages"); };
destination console { usertty("root"); };
#設定filter條件,filter filter_name{expresson;}; expression為各條件以and or not
#連結
#facility(string1,string2):篩選出包含string1或string2其中之一個字串的log.
#level(S1..S2..S3) or priority(S1..S2..S3),篩選出包含其中之一level的log
filter f_lpr { facility(lpr); };
filter f_mail { facility(mail); };
filter f_messages { level(info..emerg) and not facility(mail,lpr); };
filter f_emergency { level(emerg); };
###############################################################
# 將設定好的source,filter,destination依需求作組合
log { source(src); filter(f_lpr); destination(lpr); };
log { source(src); filter(f_mail); destination(mail); };
log { source(src); filter(f_messages); destination(messages); };
log { source(src); filter(f_emergency); destination(console); };
###############################################################
#將收到的所有log依host分資料夾,再依該log的facility code分別儲存,
#並設定owner, group, permission, directory permission
destination hosts { file("/var/log/HOSTS/$HOST/$FACILITY" owner(root) group(root) perm(0600) dir_perm(0700) create_dirs(yes)); };
log { source(remote); destination(hosts); };
###############################################################
另外,我們必須將/etc/logrotate.d/syslog置換成以下syslog-ng:
/var/log/lpr.log {
postrotate
/bin/kill -HUP `cat /var/run/syslogd-ng.pid 2> /dev/null` 2> /dev/null ||
true
endscript
}
/var/log/mail.log {
postrotate
/bin/kill -HUP `cat /var/run/syslogd-ng.pid 2> /dev/null` 2> /dev/null ||
true
endscript
}
/var/log/messages {
postrotate
/bin/kill -HUP `cat /var/run/syslogd-ng.pid 2> /dev/null` 2> /dev/null ||
true
endscript
}
/var/log/lastlog {
postrotate
/bin/kill -HUP `cat /var/run/syslogd-ng.pid 2> /dev/null` 2> /dev/null ||
true
endscript
}
最後啟動syslog-ng!
#/etc/rc.d/init.d/syslog-ng start
四、結合database
(1)如果我們希望將log值存進資料庫的話,我們必須將先將database server建起來(這裡我們選擇mysql),我們必須產生一個syslog.sql以建立資料庫及資料表:
CREATE DATABASE syslog;
USE syslog;
CREATE TABLE logs (
host varchar(32) default NULL,
facility varchar(10) default NULL,
priority varchar(10) default NULL,
level varchar(10) default NULL,
tag varchar(10) default NULL,
date date default NULL,
time time default NULL,
program varchar(15) default NULL,
msg text,
seq int(10) unsigned NOT NULL auto_increment,
PRIMARY KEY (seq),
KEY host (host),
KEY seq (seq),
KEY program (program),
KEY time (time),
KEY date (date),
KEY priority (priority),
KEY facility (facility)
) TYPE=MyISAM;
然後執行mysql -u root -p < syslog.sql。
(1) 執行mkfifo /tmp/mysql.pipe
(2) 執行mysql -u root --password=passwd syslog < /tmp/mysql.pipe
(3) 最後,我們必須在syslog-ng.conf增加一條command:
destination d_mysql {
pipe("/tmp/mysql.pipe"
template("INSERT INTO logs (host, facility, priority, level, tag, date, time, program, msg) VALUES ( '$HOST', '$FACILITY', '$PRIORITY', '$LEVEL', '$TAG', '$YEAR-$MONTH-$DAY', '$HOUR:$MIN:$SEC', '$PROGRAM', '$MSG' );\n") template-escape(yes));
};
log { source(net); destination(d_mysql);};
(4) 重開syslog-ng
/etc/init.d/syslog-ng stop # Stop syslog-ng
/etc/ini.d/syslog-ng start # Start syslog-ng