實驗目標
用syslog-ng過濾日誌並轉存到日誌服務器上
通過cacti的syslog插件將日誌web顯示
實驗環境
Gentoo 3.8.13系統
預安裝LAMP ssh
需要軟件
syslog-ng## gentoo系統自帶
其他需求
Gentoo的安裝
Cacti的安裝
LAMP環境安裝
參考blog相關文章
http://chengchow.blog.51cto.com/all/1642666
服務器需求
至少2臺服務器,下面測試我用了4臺,相關信息如下:
IP地址 | 主機名稱 | 主機編號 |
192.168.254.123 | syslog | 1 |
192.168.254.81 | namenode | 2 |
192.168.254.84 | datanode | 3 |
192.168.254.85 | tasktracker(datanode2) | 4 |
192.168.254.1 | **-***-**(my windows) | 5 |
參考文檔
Syslog-ng安裝配置
http://wenku.baidu.com/view/6a502e7d168884868762d648.html
cacti下syslog插件安裝
實驗步驟
一 syslog服務器配置
Syslog-ng的安裝
在主機1上
如果沒有安裝syslog-ng
Shell>USE=”sql” emerge syslog-ng
Shell>/etc/init.d/syslog-ng start
Shell>rc-update add syslog-ng default
Shell>emerge event-log
配置 syslog-ng.conf文件
Shell> cat /etc/syslog-ng/syslog-ng.conf
@version: 3.2 # # configuration file for syslog-ng, customized for remote logging # options { use_fqdn(yes); chain_hostnames(off); keep_hostname(off); flush_lines(0); # 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_freq(43200); create_dirs(yes); }; source src { unix-stream("/dev/log" max-connections(256)); internal(); file("/proc/kmsg"); }; destination messages { file("/var/log/messages"); }; destination console_all { file("/dev/tty12"); }; source s_internal { internal(); }; destination d_syslognglog { file("/var/log/syslog-ng.log"); }; log { source(s_internal); destination(d_syslognglog); }; source s_sys { file ("/proc/kmsg" program_override("kernel: ")); unix-stream ("/dev/log"); internal(); }; destination d_cons { file("/dev/console"); }; destination d_mesg { file("/var/log/messages"); }; destination d_auth { file("/var/log/secure"); }; destination d_mail { file("/var/log/maillog"); }; destination d_spol { file("/var/log/spooler"); }; destination d_boot { file("/var/log/boot.log"); }; destination d_cron { file("/var/log/cron"); }; destination d_rsync { file("/var/log/rsync"); }; destination d_mlal { usertty("*"); }; filter f_filter1 { facility(kern); }; filter f_filter2 { level(info) and not (facility(mail) or facility(authpriv) or facility(cron)); }; filter f_filter3 { facility(authpriv); }; filter f_filter4 { facility(mail); }; filter f_filter5 { level(emerg); }; filter f_filter6 { facility(uucp) or (facility(news) and level(crit)); }; filter f_filter7 { facility(local7); }; filter f_filter8 { facility(cron); }; filter f_filter9 { facility(daemon); }; filter f_filter10 { facility(local6); }; #log { source(s_sys); filter(f_filter1); destination(d_cons); }; #log { source(s_sys); filter(f_filter2); destination(d_mesg); }; #log { source(s_sys); filter(f_filter3); destination(d_auth); }; #log { source(s_sys); filter(f_filter4); destination(d_mail); }; #log { source(s_sys); filter(f_filter5); destination(d_mlal); }; #log { source(s_sys); filter(f_filter6); destination(d_spol); }; #log { source(s_sys); filter(f_filter7); destination(d_boot); }; #log { source(s_sys); filter(f_filter8); destination(d_cron); }; # Remote logging source s_remote { udp(ip(0.0.0.0) port(514)); }; destination r_mesg { file("/var/log/syslog-ng/$YEAR/$MONTH/$HOST/messages" owner("root") group("root") perm(0640) dir_perm(0750) create_dirs(yes)); }; destination r_auth { file("/var/log/syslog-ng/$YEAR/$MONTH/$HOST/secure" owner("root") group("root") perm(0640) dir_perm(0750) create_dirs(yes)); }; destination r_mail { file("/var/log/syslog-ng/$YEAR/$MONTH/$HOST/maillog" owner("root") group("root") perm(0640) dir_perm(0750) create_dirs(yes)); }; destination r_spol { file("/var/log/syslog-ng/$YEAR/$MONTH/$HOST/spooler" owner("root") group("root") perm(0640) dir_perm(0750) create_dirs(yes)); }; destination r_boot { file("/var/log/syslog-ng/$YEAR/$MONTH/$HOST/boot.log" owner("root") group("root") perm(0640) dir_perm(0750) create_dirs(yes)); }; destination r_cron { file("/var/log/syslog-ng/$YEAR/$MONTH/$HOST/cron" owner("root") group("root") perm(0640) dir_perm(0750) create_dirs(yes)); }; destination r_daemon { file("/var/log/syslog-ng/$YEAR/$MONTH/$HOST/daemon" owner("root") group("root") perm(0640) dir_perm(0750) create_dirs(yes)); }; destination r_local6 { file("/var/log/syslog-ng/$YEAR/$MONTH/network/messages" owner("root") group("root") perm(0640) dir_perm(0750) create_dirs(yes)); }; #destination d_separatedbyhosts { # file("/var/log/syslog-ng/$HOST/messages" owner("root") group("root") perm(0640) dir_perm(0750) create_dirs(yes)); #}; #log { source(s_remote); destination(d_separatedbyhosts); }; log { source(s_remote); filter(f_filter2); destination(r_mesg); }; log { source(s_remote); filter(f_filter3); destination(r_auth); }; log { source(s_remote); filter(f_filter4); destination(r_mail); }; log { source(s_remote); filter(f_filter6); destination(r_spol); }; log { source(s_remote); filter(f_filter7); destination(r_boot); }; log { source(s_remote); filter(f_filter8); destination(r_cron); }; log { source(s_remote); filter(f_filter9); destination(r_daemon); }; log { source(s_remote); filter(f_filter10); destination(r_local6); }; ## cacti settings # cacti local settings destination d_mysql { pipe("/tmp/mysql.pipe" template("INSERT INTO syslog_incoming(host,facility,priority,date,time,message) VALUES('$HOST','$FACILITY','$PRIORITY','$YEAR-$MONTH-$DAY','$HOUR:$MIN:$SEC','$MSG');\n") template-escape(yes)); }; log{ source(s_remote);destination(d_mysql); }; log{ source(s_sys);destination(d_mysql); }; # cacti remote settings #destination r_mysql { # pipe("/tmp/mysql.pipe" owner("root") group("root") # template("INSERT INTO syslog_incoming(host,facility,priority,date,time,message) VALUES('$HOST','$FACILITY','$PRIORITY','$YEAR-$MONTH-$DAY','$HOUR:$MIN:$SEC','$MSG');\n") # template-escape(yes)); #}; #log { source(s_remote); destination(r_mysql); }; ## client settings destination d_udp { udp ("192.168.254.123" port(514)); }; log { source(src);destination(d_udp); };
這裏編寫的比較亂,是用了Ubuntu syslog-ng自帶的配置文件做的修改,本地日誌生成被我停掉了,所有日誌都是通過514端口獲取,包括syslog服務器的日誌,具體配置文件的說明參見附件3
添加IP地址對應主機名稱解析
有DNS服務器不需要
Shell>vi /etc/hosts
客戶端配置
在2-4上
如果沒有安裝syslog-ng
Shell>emerge syslog-ng
Shell>/etc/init.d/syslog-ng start
Shell>rc-update add syslog-ng default
配置syslog-ng.conf文件
Shell>echo “destination d_udp { udp(“192.168.254.123”prot(514)); }; ” >>/etc/syslog-ng/syslog-ng.conf
Shell>echo “log { source(src);destination(d_udp); };” >> /etc/syslog-ng/syslog-ng.conf
Shell>cat /etc/syslog-ng/syslog-ng.conf
具體配置的說明參考附件3
這裏source(src)默認配置自帶
重啓syslog服務
在1-4上
Shell> /etc/init.d/syslog-ng restart
到這裏syslog服務器就配置完成了
測試
配置完成去主機1上,進入syslog-ng日誌目錄,如下
可以看到對應的服務器日誌文件夾,這裏我們用主機2測試,打開 secure(登錄驗證日誌)
Shell>tail -f /var/log/syslog-ng/2014/04/namenode/secure
另外在開一個終端,登錄主機2,如果日誌有變化,則說明配置成功
Message/daemon/cron測試日誌同上
Message系統日誌
Daemon服務開啓/關閉日誌
Secure用戶驗證日誌
Cron計劃任務日誌
Windows客戶端配置
Windows服務器不支持日誌服務器,需要安裝一個轉換軟件evtsys:
下載地址爲:
http://down.51cto.com/tag-evtsys.html
根據系統的版本下載32位和64位的程序。
解壓後是兩個文件evtsys.dll和evtsys.exe
把這兩個文件拷貝到 c:\windows\system32目錄下。
以下操作在CMD下
安裝evtsys服務
C:\>evtsys –i –h 192.168.254.123 –p 514
-i 表示安裝成系統服務
-h 指定log服務器的IP地址
-p 指定端口
詳細參數使用evtsys /?查看
啓動evtsys
C:\net start evtsys
停止 evtsys
c:\net stop evtsys
卸載evtsys:
evtsys –u
效果如下
這裏有箇中文字體會轉碼的問題,如上圖操作”View”à”Encoding”à”Unicode(UTF-8)”.
二 cacti syslog插件安裝配置
關於cacti配置及cacti syslog插件的安裝,參考之前的筆記
http://chengchow.blog.51cto.com/all/1642666
下面主要說用cacti syslog插件讀取syslog日誌
Cacti for syslog的安裝目錄
先配置下權限問題
Shell> cd /var/www/localhost/htdocs/cacti/plugins/syslog
Shell> chmod –R 755 +x ../syslog
Shell> chown –R cactiuser:cactiuser ../syslog
Syslog數據庫導入
這裏有兩種方法
方法1:利用原來的cacti數據(優點是不需要另外創建數據庫,缺點是日誌文件太多,不方便管理)
Shell> mysql –uroot –p cactidb < syslog.sql
方法2:新建立個數據庫管理
Shell> mysql –uroot –p
mysql> create databse syslogdb;
mysql>grant all privileges on syslogdb.* to ‘sysloguser’@’localhost’ indentify by ‘syslogpass’;
mysql>quit
shell> mysql –uroot –p syslogdb < syslog.sql
這裏用方法1
Cacti for syslog配置文件修改
Shell> vi ./config.php
注意箭頭部分,true是使用cactidb數據庫,false是使用自建數據庫
同步日誌的到數據庫腳本
Shell> cat ./syslog2mysql.sh
#!/bin/bash if [ ! -e /tmp/mysql.pipe ];then mkfifo /tmp/mysql.pipe fi while [ -e /tmp/mysql.pipe ] do mysql -ucactiuser -pcactipass cactidb < /tmp/mysql.pipe done exit 0
運行腳本,一個死循環,需要在後臺運行
Shell> nohup ./syslog2mysql.sh &
注意,腳本里面的臨時文件路徑,必須是在syslog-ng.conf裏面destination配置路徑
添加計劃任務
Shell> vi /etc/crontab
這裏爲了測試方便,改成了1分鐘獲取一次數據,時間日誌同步建議和cacti獲取時間同步
登錄cacti界面
“console”à”configuration”à”plugins management”會出現如下界面
如果沒有如下界面也沒關係,刪除syslog插件重新登錄,按照以上步驟就會出現,主要是一些參數的選擇
第一個選項有MyISAM和Innodb兩種數據庫類型,建議選innodb.
第二個是數據庫結構,5.5以上可以直接選擇partitioined table,5.1.6以下不支持.
第三個是日誌保存時間,最大爲1年.
第一次登錄好像還有個參數,沒留意什麼,直接默認安裝了
如果不清楚選項含義,可以全部默認,默認配置性能上不能達到最優,兼容性最好,選擇完成點擊Install按鈕安裝。
安裝完成,如果有安裝clog插件的,順便看下cacti日誌是否有報錯;
如果沒有錯誤,繼續;
在1-4上面做服務重啓或者登錄的操作,等待幾分鐘,點擊syslog頁面查看,如下界面。
1選擇頁面
2主機名稱
3過濾選項
4日誌內容
5日誌等級顏色標誌
附件1:syslog日誌獲取流程
附件2:cacti for syslog日誌獲取流程
附件3: syslog-ng.conf配置簡單介紹
Syslog-ng.conf一共有5個字段(1-5)
1.Option { };
全局選項
選項格式
options { opt1; opt2; ... };
選項:
chain_hostnames(yes|no) :是否打開主機名鏈功能,打開後可在多網絡段轉發日誌時有效
long_hostnames(yes|no) :是chain_hostnames的別名,已不建議使用
keep_hostname(yes|no) :是否保留日誌消息中保存的主機名稱,否時,總是使用來源主機來作重寫日誌的主機名
use_dns(yes|no) :是否打開DNS查詢功能,應使用防火牆保護使用syslog-ng的節點安全,並確認所有主機都是可以通過dns解釋的,否則請關閉該選項。
use_fqdn(yes|no) :是否使用完整的域名
check_hostname(yes|no) :是否檢查主機名有沒有包含不合法的字符
bad_hostname(regexp) :可通過正規表達式指定某主機的信息不被接受
dns_cache(yes|no) :是否打開DNS緩存功能
dns_cache_expire(n) :DNS緩存功能打開時,一個成功緩存的過期時間
dns_cache_expire_failed(n) :DNS緩存功能打開時,一個失敗緩存的過期時間
dns_cache_size(n) :DNS緩存保留的主機名數量
create_dirs(yes|no) :當指定的目標目錄不存在時,是否創建該目錄
dir_owner(uid) :目錄的UID
dir_group(gid) :目錄的GID
dir_perm(perm) :目錄的權限,使用八進制方式標註,例如0644
owner(uid) :文件的UID
group(gid) :文件的GID
perm(perm) :文件的權限,同樣,使用八進制方式標註
gc_busy_threshold(n) :當syslog-ng忙時,其進入垃圾信息收集狀態的時間。一旦分派的對象達到這個數字,syslog-ng就啓動垃圾信息收集狀態。默認值是:3000。
gc_idle_threshold(n) :當syslog-ng空閒時,其進入垃圾信息收集狀態的時間。一旦被分派的對象到達這個數字,syslog-ng就會啓動垃圾信息收集狀態,默認值是:100
log_fifo_size(n) :輸出隊列的行數
log_msg_size(n) :消息日誌的最大值(bytes)
mark(n) :多少時間(秒)寫入兩行MARK信息供參考,目前沒有實現
stats(n) :多少時間(秒)寫入兩行STATUS信息供,默認值是:600
sync(n) :緩存多少行的信息再寫入文件中,0爲不緩存,局部參數可以覆蓋該值。
time_reap(n) :在沒有消息前,到達多少秒,即關閉該文件的連接
time_reopen(n) :對於死連接,到達多少秒,會重新連接
use_time_recvd(yes|no) :宏產生的時間是使用接受到的時間,還是日誌中記錄的時間;建議使用R_的宏代替接收時間,S_的宏代替日誌記錄的時間,而不要依靠該值定義。
2.Source { };
source <sourcename> { 日誌源; 日誌源; ... };
#日誌源可用參數:
file (filename) :從指定的文件讀取日誌信息
unix-dgram(filename) :從SOCK_DGRAM模式的unix套接字接收日誌消息
unix-stream (filename) :從SOCK_STREAM模式的unix套接字接收日誌消息
udp ( (ip),(port) ) :從UDP端口接收日誌
tcp ( (ip),(port) ) :從TCP端口接收日誌
internal() : syslog-ng內部產生的日誌
pipe(filename),fifo(filename) :從指定的管道或者FIFO設備,讀取日誌信息可以同
時配置多個日誌,
經典應用
source s_sys { file ("/proc/kmsg" log_prefix("kernel: ")); unix-stream ("/dev/log"); internal(); };
3.Filter { };
filter <filtername> { 過濾參數; };
#過濾參數可用:
facility(,):根據facility(設備)選擇日誌消息,使用逗號分割多個facilitylevel(,):根
據level(優先級)選擇日誌消息,使用逗號分割多個level,或使用“..”表示一個範圍
program(regexp):日誌消息的程序名是否匹配一個正則表達式
host(regexp):日誌消息的主機名是否和一個正則表達式匹配
match(regexp):對日誌消息的內容進行正則匹配
filter():調用另一條過濾規則並判斷它的值
#過濾參數操作式:
And與
or 或
not 非
#facility(設備)可用消息類型
Auth用戶認證
authpriv有特權的用戶認證
croncron守護進程
daemon各種系統守護進程
ftpftp守護進程
kern內核消息
local0-local7保留用於本地用法
lpr打印機
mail郵件
news新聞
syslog內部syslog
uucpuucp系統
user各種用戶程序來的消息
cacti中filter參數查詢的分類
#Level等級:
emerg最嚴重的錯誤 (如system panic)
alert需要立即處理的嚴重錯誤
critcritical warming
err普通錯誤
warn警告信息
notice比較不嚴重的信息
info普通信息
debug除錯信息
cacti中fileter等級查詢的分類
4.Destination { };
destination <name> { 目標操作; 目標操作;...;};
#目標操作常用參數:
file (filename) :寫入指定文件
unix-dgram(filename) :寫入SOCK_DGRAM模式的unix套接字
unix-stream (filename) :寫入SOCK_STREAM模式的unix套接字
tcp(ip),(port) :以TCP協議發送指定主機端口
udp (ip),(port) :以UDP協議發送指定主機端口
usertty(username) :把日誌消息發送到已經登陸的指定用戶終端
pipe(filename),fifo(filename):把日誌消息發送到指定管道或FIFO設備
program(parm) :啓動指定的程序,並把日誌消息發送到該進程的標準輸入
5.Log { };
日誌生成
格式
Log {source<sourcename> filter<filtername> destination<destinationname> };
Filter可以省略,不過濾日誌。
6.擴展file部分函數的參數
syslog-ng除了有全局選項參數外,不同的函數還可以定義其參數,其中包括:
6.1、擴展file的宏
HOST 日誌消息的源發主機名。如果日誌消息穿過幾個主機,並且chain_hostname()功能已經打開,就使用第一個主機名。
FACILITY :日誌消息來自的日誌設備
PRIOPRITY/LEVEL :日誌消息的優先級
PROGRAM :發送日誌消息的程序
YEAR :發送日誌消息的年份,這個宏既可以指定日誌消息送出的時間,也可以指定日誌消息收到的時間。這由use_time_recvd()選項控制
MONTH :發送日誌消息的月份
DAY :發送日誌消息的日子
HOUR :小時
MIN :分鐘
SEC :秒
6.2、file的參數
log_file_size()日誌文件大小
program_override()原來的sync參數
owner()日誌文件用戶
perm()日誌文件權限
group()日誌文件用戶組
dir_perm()日誌文件夾權限
create_dir ()自動創建文件夾
6.3、tcp和upd的參數
ip(xxx.xxx.xxx.xxx):定義綁定的IP地址
port(n):定義綁定的端口
max-connections(n):定義最大連接數
※TCP基於連接方式傳輸,不會造成日誌丟失,而UDP則不同。但因爲傳統的syslog基於UDP的514端口,所以,UDP方式也經常會使用到。
另外,514也是rshell的默認端口,請注意衝突。
實驗文檔使用的就是udp連接