簡介
先簡單介紹一下syslog-ng
看到syslog-ng不由的會想到syslog侧馅。其實syslog-ng就是syslog的升級版制市,當然允粤,功能也比syslog強大。比如:高性能问芬、支持多平臺悦析、高可靠的傳輸、眾多的用戶群體此衅、強大的日志過濾强戴、排序。
系統(tǒng)環(huán)境:CentOS7
我們yum安裝挡鞍,首先添加包含syslog-ng的最新非官方版本的repo骑歹。將repo文件下載到/etc/yum.repos.d/,以便安裝和啟用syslog-ng:
cd /etc/yum.repos.d/
yum install syslog-ng
yum install syslog-ng-http
systemctl enable syslog-ng
systemctl start syslog-ng
雖然并非嚴格要求墨微,但如果您同時刪除rsyslog道媚,則可以避免一些混淆:
yum erase rsyslog
安裝啟動好以后,最終要的部分來了翘县,那就是配置最域。
用yum安裝的配置文件路徑為/etc/syslog-ng/syslog-ng.conf。
整個配置文件大致分為全局配置炼蹦、消息源、過濾器狸剃、消息目的地和日志路徑幾部分掐隐。
全局配置:
options{opt1;opt2;...};
chain_hostnames(yes|no)# 是否打開主機名鏈功能,打開后可在多網(wǎng)絡段轉發(fā)日志時有效
long_hostnames(yes|no)# 是chain_hostnames的別名,已不建議使用
keep_hostname(yes|no)# 是否保留日志消息中保存的主機名稱
use_dns(yes|no)# 是否打開DNS查詢功能虑省,
use_fqdn(yes|no)# 是否使用完整的域名
check_hostname(yes|no)# 是否檢查主機名有沒有包含不合法的字符
bad_hostname(regexp)# 可通過正規(guī)表達式指定某主機的信息不被接受
dns_cache(yes|no)# 是否打開DNS緩存功能
dns_cache_expire(n)# DNS緩存功能打開時匿刮,一個成功緩存的過期時間
dns_cache_expire_failed(n)# DNS緩存功能打開時,一個失敗緩存的過期時間
dns_cache_size(n)# DNS緩存保留的主機名數(shù)量
create_dirs(yes|no)# 當指定的目標目錄不存在時探颈,是否創(chuàng)建該目錄
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忙時,其進入垃圾信息收集狀態(tài)的時間一旦分派的對象達到這個數(shù)字怀大,syslog-ng就啟動垃圾信息收集狀態(tài)纱兑。默認值是:3000。
gc_idle_threshold(n)# 當syslog-ng空閑時化借,其進入垃圾信息收集狀態(tài)的時間一旦被分派的對象到達這個數(shù)字潜慎,syslog-ng就會啟動垃圾信息收集狀態(tài),默認值是:100
log_fifo_size(n)# 輸出隊列的行數(shù)
log_msg_size(n)# 消息日志的最大值(bytes)
mark(n)# 多少時間(秒)寫入兩行MARK信息供參考蓖康,目前沒有實現(xiàn)
stats(n)# 多少時間(秒)寫入兩行STATUS信息,默認值是:600
sync(n)# 緩存多少行的信息再寫入文件中铐炫,0為不緩存,局部參數(shù)可以覆蓋該值蒜焊。
time_reap(n)# 在沒有消息前倒信,到達多少秒,即關閉該文件的連接
time_reopen(n)# 對于死連接山涡,到達多少秒堤结,會重新連接
use_time_recvd(yes|no)# 宏產(chǎn)生的時間是使用接受到的時間,還是日志中記錄的時間鸭丛;建議使用R_的宏代替接收時間竞穷,S_的宏代替日志記錄的時間,而不要依靠該值定義鳞溉。
消息源:
source<sourcename>{sourcedriver params;sourcedriver params;...};
internal()# syslog-ng內部產(chǎn)生的消息
file()# 從指定的文件讀取日志信息
pipe()# 從指定的管道瘾带,讀取日志信息
fifo()# 從指定的FIFO設備,讀取日志信息
program()# 打開指定的應用程序熟菲,從它的標準輸出讀取消息
sun-stream(), sun-streams()# 在solaris系統(tǒng)中看政,打開一個(多個)指定的STREAM設備,從其中讀取日志消息
tcp(), tcp6()# 在指定的TCP端口接收日志消息
udp(), udp6()# 在指定的UDP端口接收日志消息
unix-dgram()# 打開指定的SOCK_DGRAM模式的unix套接字抄罕,接收日志消息
unix-stream()# 打開指定的SOCK_STREAM模式的unix套接字允蚣,接收日志消息
過濾器:
filter<filtername>{expression;};
facility()# 根據(jù)facility(設備)選擇日志消息
filter()# 調用另一條過濾規(guī)則
host()# 日志消息的主機名是否和一個正則表達式匹配
level()or priority()# 根據(jù)level(優(yōu)先級)選擇日志消息消息目的地:
match()# 對日志消息的內容進行正則匹配
消息目的地:
destination<destname>{destdriver params;destdriver params;...;};
file()# 把日志消息寫入指定的文件
pipe()# 把日志消息發(fā)送到指定的管道
fifo()# 把日志消息發(fā)送到指定的FIFO設備
program()# 啟動指定的程序,并把日志消息發(fā)送到該進程的標準輸入
sql()# 把日志消息寫入數(shù)據(jù)庫呆贿,適用于3.x版本及更高版本的syslog-ng
tcp()and tcp6()# 把日志消息發(fā)送到指定的TCP端口
udp()and udp6()# 把日志消息發(fā)送到指定的UDP端口
unix-dgram()# 把日志消息寫入指定的SOCK_DGRAM模式的unix套接字
unix-stream()# 把日志消息寫入指定的SOCK_STREAM模式的unix套接字
usertty()# 把日志消息發(fā)送到已經(jīng)登陸的指定用戶終端窗口
消息路徑:
log{sourceS1;sourceS2;...filter F1;filter F2;... destination D1;destination D2;...};
單機配置:
options {
????sync (0);
????time_reopen (10);
????log_fifo_size (1000);
????long_hostnames (off);
????use_dns (no);
????use_fqdn (no);
????create_dirs (no);
????keep_hostname (yes);
};
source s_sys {
????file ("/proc/kmsg"log_prefix("kernel:"));
????unix-stream ("/dev/log");
????internal();
????# udp(ip(0.0.0.0) port(514));
};
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"sync(10)); };
destination d_spol {file("/var/log/spooler"); };
destination d_boot {file("/var/log/boot.log"); };
destination d_cron {file("/var/log/cron"); };
destination d_kern { file("/var/log/kern");};
destination d_mlal {usertty("*"); };
filter f_kernel????{ facility(kern); };
filter f_default???{
????level(info..emerg) and
????not (facility(mail)
????or facility(authpriv)
????or facility(cron));
};
filter f_auth??????{ facility(authpriv); };
filter f_mail??????{ facility(mail); };
filter f_emergency?{ level(emerg); };
filter f_news??????{
????facility(uucp) or
????(facility(news)
????andlevel(crit..emerg));
};
filter f_boot?? {facility(local7); };
filter f_cron?? {facility(cron); };
#log { source(s_sys);filter(f_kernel);destination(d_cons); };
log { source(s_sys);filter(f_kernel); destination(d_kern);};
log { source(s_sys);filter(f_default); destination(d_mesg);};
log { source(s_sys);filter(f_auth); destination(d_auth); };
log { source(s_sys);filter(f_mail); destination(d_mail); };
log { source(s_sys);filter(f_emergency); destination(d_mlal);};
log { source(s_sys);filter(f_news); destination(d_spol); };
log { source(s_sys);filter(f_boot); destination(d_boot); };
log { source(s_sys);filter(f_cron); destination(d_cron); };
日志入庫:
創(chuàng)建需要的庫
CREATE DATABASE syslog;
USE syslog;
CREATE TABLE logs (
????host varchar(32) default NULL,
????facility varchar(10) defaultNULL,
????priority varchar(10) defaultNULL,
????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 NULLauto_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;
mkfifo /tmp/mysql.pipe
source s_sys {
????file ("/proc/kmsg"log_prefix("kernel: "));
????unix-stream ("/dev/log");
????internal();
????udp(ip(0.0.0.0) port(514));
};
destination d_mysql {
????program("/usr/bin/mysql-uroot syslog < /tmp/mysql.pipe");
????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(s_sys);destination(d_mysql); };
實例:
#全局的選項參數(shù)嚷兔,定義在配置文件的開頭位置:
options {
? ?sync (0); #緩存多少行的信息再寫入文件中森渐,0為不緩存,局部參數(shù)可以覆蓋該值冒晰。
? ?time_reopen (10); #對于死連接同衣,到達多少秒,會重新連接
? ?log_fifo_size (1000); #輸出隊列的行數(shù)
? ?use_dns (no); #是否打開DNS查詢功能壶运,應使用防火墻保護使用syslog-ng的節(jié)點安全耐齐,并確認所有主機都是可以通過dns解釋的,否則請關閉該選項蒋情。
? ?use_fqdn (no); #是否使用完整的域名
? ?create_dirs (yes); #當指定的目標目錄不存在時埠况,是否創(chuàng)建該目錄
? ?keep_hostname (yes); #是否保留日志消息中保存的主機名稱,否時恕出,總是使用來源主機來作重寫日志的主機名
? ??gc_busy_threshold(3000)?:#當syslog-ng忙時询枚,其進入垃圾信息收集狀態(tài)的時間。一旦分派的對象達到這個數(shù)字浙巫,syslog-ng就啟動垃圾信息收集狀態(tài)金蜀。默認值是:3000。
????gc_idle_threshold(100)?:#當syslog-ng空閑時的畴,其進入垃圾信息收集狀態(tài)的時間渊抄。一旦被分派的對象到達這個數(shù)字,syslog-ng就會啟動垃圾信息收集狀態(tài)丧裁,默認值是:100
};?
?#消息源SOURCES?
source s_sys {#消息來源
????file ("/proc/kmsg" log_prefix("kernel: "));????#從指定的文件讀取日志信息
????unix-stream ("/dev/log");????#打開指定的SOCK_STREAM模式的unix套接字护桦,接收日志消息
????internal();????#syslog-ng內部產(chǎn)生的消息
????# udp(ip(0.0.0.0) port(514));?
???#?如果取消注釋,則可以從udp的514端口獲取消息
? ? #寫上服務的端口即可獲取此服務的信息
};
#從file中讀取日志煎娇,過濾error的信息
filter error_filter {#消息過濾
? ??host("192.16.1.91") and match("error");
? ? #可以匹配關鍵子進行過濾二庵,也可對日志消息的內容進行正則匹配
}
#目的地DESTINATIONS
destination d_mesg? {#消息目的地,把日志信息寫入指定的文件
? ???file("/var/log/messages")
}
#消息路徑LOG STATEMENTS
log ?{
????source s_sys;
????filter error_filter;
????destination d_mesg?;
};
把消息源缓呛、過濾器催享、消息目的組合起來就形成一條完整的指令。日志路徑中的成員是順序執(zhí)行的哟绊。凡是來源于指定的消息源因妙,匹配所有指定的過濾器,并送到指定的地址票髓。