syslog-ng應用詳解


syslog-ng應用詳解

 
科技小能手 2017-11-07 02:43:00 瀏覽136 評論0

摘要: 最近做一個新項目,要做日志集中收集和處理,拿到機器一看,這批機器用的都是SUSE10 SP2系統,日志服務器用的都是syslog-ng。之前寫過寫過一篇關於rsyslog的博文,目前也用不上了。總不能把這些機器都挨個裝一遍rsyslog吧。

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

 

簡介

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

 

Syslog-ng主要特性有:

  • 支持SSL/TSL協議

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

  • 支持標准的syslog協議

  • 支持filter、parse以及rewrite

  • 支持更多的平台

  • 更高的負載能力

 

Syslog-ng工作原理:

232919401.png

 

Syslog-ng工作模式:

  • Client mode

233007581.png

  • Relay mode

233021274.png

  • Server mode

233034386.png

 

系統環境:

Centos5.8 x86_64

安裝syslog-ng

源碼安裝

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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

233050965.jpg

 

YUM安裝

由於Centos5.8 x86_64本身的YUM源並沒有syslog-ng,所以需要先安裝EPEL源。

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

設置開機啟動項

1
2
3
4
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目錄當中。

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

如下圖所示:

233807285.jpg

全局配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
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_的宏代替日志記錄的時間,而不要依靠該值定義。

消息源:

1
2
3
4
5
6
7
8
9
10
11
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套接字,接收日志消息

過濾器:

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

消息目的地:

1
2
3
4
5
6
7
8
9
10
11
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()  # 把日志消息發送到已經登陸的指定用戶終端窗口

消息路徑:

1
log {  source  S1;  source  S2; ...filter F1; filter F2; ... destination D1; destination D2; ... };

配置實例:

  • 單機配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
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模式:

服務端配置:

1
2
3
4
5
6
7
8
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); };

客戶端配置:

1
2
3
4
5
6
7
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); };

日志入庫:

創建需要的庫

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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;
1
mkfifo  /tmp/mysql .pipe
1
2
3
4
5
6
7
8
9
10
11
12
13
14
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~

 

 

本文轉自 cyr520 51CTO博客,原文鏈接:http://blog.51cto.com/cyr520/1245650


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM