syslog-ng應用詳解

最近作一個新項目,要作日誌集中收集和處理,拿到機器一看,這批機器用的都是SUSE10 SP2系統,日誌服務器用的都是syslog-ng。以前寫過寫過一篇關於rsyslog的博文,目前也用不上了。總不能把這些機器都挨個裝一遍rsyslog吧。只能硬着頭皮學一下syslog-ng了。搜索了一下syslog-ng。發現這個服務還不錯。下面咱們就具體來了解一下吧。mysql


簡介正則表達式

Syslog-ng是由Balabit IT Security Ltd.維護的一套開源的Unix和類Unix系統的日誌服務套件。它是一個靈活的、可伸縮的系統日誌記錄程序。對於服務器日誌集中收集,使用它是一個不錯的解決方案。sql


Syslog-ng主要特性有:數據庫

  • 支持SSL/TSL協議express

  • 支持將日誌寫入數據庫中,支持的數據庫有MySQL, Microsoft SQL (MSSQL),Oracle, PostgreSQL, and SQLite.vim

  • 支持標準的syslog協議緩存

  • 支持filter、parse以及rewritebash

  • 支持更多的平臺服務器

  • 更高的負載能力網絡


Syslog-ng工做原理:


Syslog-ng工做模式:

  • Client mode

  • Relay mode

  • Server mode


系統環境:

Centos5.8 x86_64

安裝syslog-ng

源碼安裝

mkdir -p /data/software
cd/data/software
wget http://www.balabit.com/downloads/files/syslog-ng/open-source-edition/3.3.11/source/syslog-ng_3.3.11.tar.gz
wget http://www.balabit.com/downloads/files/syslog-ng/open-source-edition/3.3.11/source/eventlog_0.2.12.tar.gz
tar zxvfeventlog_0.2.12.tar.gz
cd eventlog-0.2.12/
./configure --prefix=/usr/local/eventlog
make && make install
cd /data/software
tar zxvf syslog-ng_3.3.11.tar.gz
cd syslog-ng-3.3.11/
./configure --prefix=/usr/local/syslog-ng PKG_CONFIG_PATH="/usr/local/eventlog/lib/pkgconfig"
make && make install
cp contrib/init.d.RedHat /etc/init.d/syslog-ng
chmod+x /etc/init.d/syslog-ng
vim /etc/init.d/syslog-ng


YUM安裝

因爲Centos5.8 x86_64自己的YUM源並無syslog-ng,因此須要先安裝EPEL源。

rpm -ivh http://dl.fedoraproject.org/pub/epel/5/i386/epel-release-5-4.noarch.rpm
yum -y install syslog-ng

設置開機啓動項

chkconfig syslog off
service syslog stop
chkconfig syslog-ng on
service syslog-ng start

配置文件詳解:

若是你的syslog-ng是yum或者RPM包安裝的,那配置文件路徑爲/etc/syslog-ng/syslog-ng.conf。若是你是源碼包編譯安裝的,那配置文件路徑通常在安裝路徑下的etc目錄當中。

整個配置文件大體分爲全局配置、消息源、過濾器、消息目的地和日誌路徑幾部分。

以下圖所示:

全局配置:

options { opt1; opt2; ... };
chain_hostnames(yes|no) # 是否打開主機名鏈功能,打開後可在多網絡段轉發日誌時有效
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) # 可經過正規表達式指定某主機的信息不被接受
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_的宏代替日誌記錄的時間,而不要依靠該值定義。

消息源:

source <sourcename> {sourcedriver params; sourcedriver params; ... };
internal() # syslog-ng內部產生的消息
file() # 從指定的文件讀取日誌信息
pipe() # 從指定的管道,讀取日誌信息
fifo() # 從指定的FIFO設備,讀取日誌信息
program() # 打開指定的應用程序,從它的標準輸出讀取消息
sun-stream(), sun-streams() # 在solaris系統中,打開一個(多個)指定的STREAM設備,從其中讀取日誌消息
tcp(), tcp6() # 在指定的TCP端口接收日誌消息
udp(), udp6() # 在指定的UDP端口接收日誌消息
unix-dgram() # 打開指定的SOCK_DGRAM模式的unix套接字,接收日誌消息
unix-stream() # 打開指定的SOCK_STREAM模式的unix套接字,接收日誌消息

過濾器:

filter <filtername> {expression; };
facility() # 根據facility(設備)選擇日誌消息
filter() # 調用另外一條過濾規則
host() # 日誌消息的主機名是否和一個正則表達式匹配
level() or priority() # 根據level(優先級)選擇日誌消息
match() # 對日誌消息的內容進行正則匹配

消息目的地:

destination <destname> {destdriver params; destdriver params; ... ; };
file() # 把日誌消息寫入指定的文件
pipe() # 把日誌消息發送到指定的管道
fifo() # 把日誌消息發送到指定的FIFO設備
program() # 啓動指定的程序,並把日誌消息發送到該進程的標準輸入
sql() # 把日誌消息寫入數據庫,適用於3.x版本及更高版本的syslog-ng
tcp() and tcp6() # 把日誌消息發送到指定的TCP端口
udp() and udp6() # 把日誌消息發送到指定的UDP端口
unix-dgram() # 把日誌消息寫入指定的SOCK_DGRAM模式的unix套接字
unix-stream() # 把日誌消息寫入指定的SOCK_STREAM模式的unix套接字
usertty() # 把日誌消息發送到已經登錄的指定用戶終端窗口

消息路徑:

log { source S1; source S2; ...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); };
  • C/S模式:

服務端配置:

source s_sys {
file ("/proc/kmsg"log_prefix("kernel: "));
unix-stream ("/dev/log");
internal();
udp(ip(0.0.0.0) port(514));
};
destination d_mesg {file("/var/log/messages"); };
log { source(s_sys);destination(d_mesg); };

客戶端配置:

source s_sys {
file ("/proc/kmsg"log_prefix("kernel: "));
unix-stream ("/dev/log");
internal();
};
destination d_mesg {udp(ip(0.0.0.0) port(514));};
log { source(s_sys);destination(d_mesg); };

日誌入庫:

建立須要的庫

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); };


到這裏爲止,syslog-ng經常使用的配置方法基本上都有了。你們能夠嘗試安裝使用一下,只要靈活配置好配置文件,syslog-ng不光是能夠收集系統日誌,還能夠收集各種服務日誌等等。若是你們在使用當中有什麼問題歡迎和我交流。O(∩_∩)O~

相關文章
相關標籤/搜索