一、syslog協議介紹
1、介紹在Unix類操作系統上,rsyslog廣泛應用於系統日志。rsyslog日志消息既可以記錄在本地文件中,也可以通過網絡發送到接收syslog的服務器。接收syslog的服務器可以對多個設備的syslog消息進行統一的存儲,或者解析其中的內容做相應的處理。常見的應用場景是網絡管理工具、安全管理系統、日志審計系統。
完整的syslog日志中包含產生日志的程序模塊(Facility)、嚴重性(Severity或 Level)、時間、主機名或IP、進程名、進程ID和正文。在Unix類操作系統上,能夠按Facility和Severity的組合來決定什么樣的日志消息是否需要記錄,記錄到什么地方,是否需要發送到一個接收rsyslog的服務器等。由於rsyslog簡單而靈活的特性,rsyslog不再僅限於 Unix類主機的日志記錄,任何需要記錄和發送日志的場景,都可能會使用rsyslog。
rsyslog是syslog的多線程增強版,現在Fedora、Ubuntu,、rhel6、centos6默認的日志系統都是rsyslog了。rsyslog主要用來收集系統產生的各種日志,日志默認放在/var/log/目錄下。先簡單看看配置文件,然后給幾個實例也算是對rsyslog的一個更深入的理解吧。
1、配置文件解析
主配置文件/etc/rsyslog.conf配置文件中有很多內容, 但最主要的是指定需要記錄哪些服務和需要記錄服務什么等級的信息。
格式是:日志設備[連接符號]日志級別 日志處理方式(action)
a)、日志設備(可以理解為日志類型):
|
auth --pam產生的日志
authpriv --ssh,ftp等登錄信息的驗證信息
cron --定時任務
kern --內核
lpr --打印
mail --郵件
mark(syslog) --rsyslog服務內部的信息,時間標識
news --新聞組
user --用戶程序產生的相關信息
uucp --unix to unix copy, unix主機之間相關的通訊
local1~7 --自定義的日志設備
|
b)、日志級別,從上到下,級別從高到低,記錄的信息越來越少。
|
debug --有調式信息的,日志信息最多
info --一般信息的日志,最常用
notice --最具有重要性的普通條件的信息
warning --警告級別
err --錯誤級別,阻止某個功能或者模塊不能正常工作的信息
crit --嚴重級別,阻止整個系統或者整個軟件不能正常工作的信息
alert --需要立刻修改的信息
emerg --內核崩潰等嚴重信息
none --什么都不記錄
|
c)、連接符號,其中的xxx表示某一日志級別
|
.xxx 表示小於等於xxx級別的日志信息
.=xxx 表示等於xxx級別的日志信息
.!xxx 表示在xxx之外的等級的日志信息
.* 所有等級的日志信息
|
d)、日志處理方式,意思就是將特定的日志做怎樣的處理。
|
1. 記錄到普通文件或設備文件::
/var/log/file.log #將日志記錄到文件/var/log/file.log
/dev/pts/0 #將日志記錄在設備/dev/pts/0
2. 轉發到遠程的日志服務器
@192.168.0.1 #使用UDP協議轉發到192.168.0.1的514(默認)端口
@@192.168.0.1:10514 #使用TCP協議轉發到192.168.0.1的10514端口,這是指定非默認端口10514,tcp的默認端口也是514
3. 發送給用戶(需要在線才能收到)::
root #發給root用戶
root,kadefor,up01 #使用,號分隔多個用戶
* #*號表示所有在線用戶
4. 忽略,丟棄::
~ # 忽略丟棄日志
5. 執行腳本::
^/tmp/test.sh #^號后跟可執行腳本或程序的絕對路徑,這個可以用來觸發報警動作。
|
舉2個例子
將mail的所有級別的日志,記錄到文件/var/log/maillog中,其中的符號”-“表示使用緩存模式
|
mail.* -/var/log/maillog
|
將所有日志的所有級別的信息采用UDP協議送給遠程服務器192.168.186.134一份
|
*.* @192.168.186.134
|
2、用實例說話
a)、將所有服務器的系統日志送給遠程日志服務器,遠程服務器用來接收和集中所有服務器送來的系統日志。
采用UDP協議發送和接收,在遠程服務器端配置文件/etc/rsyslog.conf開啟下面兩行
|
# Provides UDP syslog reception
$ModLoad imudp
$UDPServerRun 514
|
客服端的配置文件/etc/rsyslog.conf最后新增加一行,用來將所有的日志信息發送給遠程的服務器192.168.186.134
|
*.* @192.168.186.134
|
每次更改配置文件后不要忘記重啟rsyslog服務。
測試:重啟某台服務器的rsyslog服務看看遠程的服務器能不能收到日志
|
[root@syndic02 ~]# /etc/init.d/rsyslog restart
關閉系統日志記錄器: [確定]
啟動系統日志記錄器: [確定]
[root@syndic02 ~]#
|
看遠程的服務器已經收到了相應的日志,如果沒有收到日志是不是防火牆擋住了,如果沒有使用標准的端口還要看看是不是SELinux服務開啟了。
|
[root@saltstack ~]# tailf /var/log/messages
... ... ...
Nov 13 14:32:50 syndic02 kernel: Kernel logging (proc) stopped.
Nov 13 14:32:50 syndic02 rsyslogd: [origin software="rsyslogd"swVersion="5.8.10"x-pid="1641"x-info="
http://www.rsyslog.com"] exiting on signal 15.
Nov 13 14:32:50 syndic02 kernel: imklog 5.8.10, log source= /proc/kmsgstarted.
Nov 13 14:32:50 syndic02 rsyslogd: [origin software="rsyslogd"swVersion="5.8.10"x-pid="1657"x-info="
http://www.rsyslog.com"] start
|
b)自定義設備,手動將日志送給rsyslog服務
先修改配置文件,新增自定義設備local0並將其info級別及其以下級別的日志記錄到文件/var/log/test.log文件中
|
local0.info /var/log/test.log
|
修改配置文件后不要忘記重啟rsyslog服務使其生效
然后我們用logger命令向設備local0送日志,總共發送了4次日志,前三次的級別都是info及其以下級別的日志,第四次是debug級別的日志。參數”-t”是將每次發送的日志信息打上自定義標簽。
|
[root@syndic02 ~]# logger -p local0.info "hello world"
[root@syndic02 ~]# logger -t "This is Test" -p local0.info "hello world"
[root@syndic02 ~]# logger -t "This is Test" -p local0.warning "hello world"
[root@syndic02 ~]# logger -t "This is Test" -p local0.debug "hello world"
[root@syndic02 ~]#
|
結果是前三次都記錄到了文件/var/log/test.log中,第四條由於超過info級別為debug級別故忽略了。
|
[root@syndic02 ~]# tailf /var/log/test.log
Nov 13 14:41:27 syndic02 root: hello world
Nov 13 14:42:22 syndic02 This is Test: hello world
Nov 13 14:42:56 syndic02 This is Test: hello world
|
c、收集各台服務器的history記錄,可以參考文章《日志管理(1) 審計並收集history記錄》。
關於rsyslog的簡單介紹就這些了,其它用法如過濾、加載外部模塊、收集MySQL程序日志等,有興趣的可以繼續深入
二、syslog函數
Linux C中提供一套系統日記寫入接口,包括三個函數:openlog,syslog和closelog。
調用openlog是可選擇的。如果不調用openlog,則在第一次調用syslog時,自動調用openlog。調用closelog也是可選擇的,它只是關閉被用於與syslog守護進程通信的描述符。
#include //頭文件
void openlog (char*ident, int option, int facility);
void closelog();
void syslog(int priority, char*format,……);
priority參數的格式(severity level|facility code)
示例:
LOG_ERR|LOG_USER
severity level:
Priority Level Description
LOG_EMERG An emergency situation
LOG_ALERT High-priority problem, such as database corruption
LOG_CRIT Critical error, such as hardware failure
LOG_ERR Errors
LOG_WARNING Warning
LOG_NOTICE Special conditions requiring attention
LOG_INFO Informational messages
LOG_DEBUG Debug messages
facility value(轉自syslog.h頭文件):
#define LOG_KERN (0<<3)
#define LOG_USER (1<<3)
#define LOG_MAIL (2<<3)
#define LOG_DAEMON (3<<3)
#define LOG_AUTH (4<<3)
#define LOG_SYSLOG (5<<3)
#define LOG_LPR (6<<3)
#define LOG_NEWS (7<<3)
#define LOG_UUCP (8<<3)
#define LOG_CRON (9<<3)
#define LOG_AUTHPRIV (10<<3)
#define LOG_FTP (11<<3)
三、linux rsyslog配置
1)、syslog日志服務:
1、守護進程:syslog
2、端口:514
3、配置文件:/etc/rsyslog.conf (centos6起/etc/syslog.conf不再有!而是/etc/rsyslog.conf代替!)
4、常見日志文件:
/var/log/dmesg 內核引導信息日志
/var/log/message 標准系統錯誤信息日志
/var/log/maillog 郵件系統信息日志
/var/log/cron 計划任務日志
/var/log/secure 安全信息日志
2)、 配置文件:
syslog配置文件如下
-----------------------------------------------------------------
[root@server ~]# vim /etc/syslog.conf
# Log all kernel messages to the console.
# Logging much else clutters up the screen.
#kern.* /dev/console
# Log anything (except mail) of level info or higher.
# Don't log private authentication messages!
*.info;mail.none;authpriv.none;cron.none /var/log/messages
# The authpriv file has restricted access.
authpriv.* /var/log/secure
# Log all the mail messages in one place.
mail.* -/var/log/maillog
# Log cron stuff
cron.* /var/log/cron
# Everybody gets emergency messages
*.emerg *
# Save news errors of level crit and higher in a special file.
uucp,news.crit /var/log/spooler
# Save boot messages also to boot.log
local7.*
-----------------------------------------------------------------
配置文件中每行表示一個項目,格式為:facility.level action
由兩個部分組成:
第一部分:選擇條件(可以有一個或者多個條件),分為兩個字段。
第二部分:操作動作;
1、選擇條件
選擇條件本身分為兩個字段,之間用一個小數點(.)分隔。前一字段是一項服務,后一字段是一個優先級。選擇條件是對消息類型的一種分類,這種分類便於人們把不同類型的消息發送到不同的地方。在同一個syslog配置行上允許出現一個以上的選擇條件,但必須用分號(;)隔開。
常見facility:
kern 內核信息;
user 用戶進程信息;
mail 電子郵件相關信息;
daemon 后台進程相關信息;
authpriv 包括特權信息如用戶名在內的認證活動;
cron 計划任務信息;
syslog 系統日志信息
lpr 打印服務相關信息。
news 新聞組服務器信息
uucp uucp 生成的信息
local0----local7 本地用戶信息
例如:
52 # Log anything (except mail) of level info or higher.
53 # Don't log private authentication messages!
54 *.info;mail.none;authpriv.none;cron.none /var/log/messages
2、重要級:
重要級是選擇條件的第二個字段,它代表消息的緊急程度。
按嚴重程度由低到高排序:
debug 不包含函數條件或問題的其他信息
info 提供信息的消息
none 沒有重要級,通常用於排錯
notice 具有重要性的普通條件
warning 預警信息
err 阻止工具或某些子系統部分功能實現的錯誤條件
crit 阻止某些工具或子系統功能實現的錯誤條件
alert 需要立即被修改的條件
emerg 該系統不可用
不同的服務類型有不同的優先級,數值較大的優先級涵蓋數值較小的優先級。如果某個選擇條件只給出了一個優先級而沒有使用任何優先級限定符,對應於這個優先級的消息以及所有更緊急的消息類型都將包括在內。比如說,如果某個選擇條件里的優先級是“warning”,它實際上將把“warning”、 “err”、“crit”、“alert”和“emerg”都包括在內。
3、操作動作
日志信息可以分別記錄到多個文件里,還可以發送到命名管道、其他程序甚至另一台機器。
syslog 主要支持以下活動:
file 指定文件的絕對路徑
terminal 或 prin 完全的串行或並行設備標志符
@host(@IP地址) 遠程的日志服務器
3)、 搭建Linux日志服務器:
1、編輯/etc/sysconfig/syslog文件,讓服務器能夠接受客戶端傳來的數據:
在“SYSLOGD_OPTIONS”行上加“-r”選項以允許接受外來日志消息。
-----------------------------------------------------------------
[root@client ~]# vim /etc/sysconfig/syslog
# Options to syslogd
# -m 0 disables 'MARK' messages.
# -r enables logging from remote machines
# -x disables DNS lookups on messages recieved with -r
# See syslogd(8) for more details
SYSLOGD_OPTIONS="-r -m 0"
# Options to klogd
# -2 prints all kernel oops messages twice; once for klogd to decode, and
# once for processing with 'ksymoops'
# -x disables all klogd processing of oops messages entirely
# See klogd(8) for more details
KLOGD_OPTIONS="-x"
#
SYSLOG_UMASK=077
# set this to a umask value to use for all log files as in umask(1).
# By default, all permissions are removed for "group" and "other".
-----------------------------------------------------------------
2、重新啟動syslog守護進程。
-----------------------------------------------------------------
[root@client ~]# service rsyslog restart
關閉內核日志記錄器: [確定]
關閉系統日志記錄器: [確定]
啟動系統日志記錄器: [確定]
啟動內核日志記錄器: [確定]
[root@client ~]#
-----------------------------------------------------------------
3、關閉iptables
[root@client ~]# service iptable stop
查看防火牆狀態
# service iptable status
四、配置各客戶端:
1、配置/etc/syslog.conf修改客戶機/etc/syslog.conf文件,在有關配置行的操作動作部分用一個“@”字符指向日志服務器
-----------------------------------------------------------------
[root@client ~]# vim /etc/syslog.conf
# Log all kernel messages to the console.
# Logging much else clutters up the screen.
#kern.* /dev/console
*.* @10.64.165.210
# The authpriv file has restricted access.
authpriv.* /var/log/secure
……下面省略
-----------------------------------------------------------------
另外如果配置了DNS域名的話可以使用域名。
2、重啟客戶端syslog使設置生效。
檢測成果:
下圖是我們在客戶端重啟iptables服務后在服務端看到的日志情況:
-----------------------------------------------------------------
[root@client ~]# cat /var/log/messages |tail
Nov 30 16:44:29 10.64.165.200 kernel: klogd 1.4.1, log source = /proc/kmsg started.
Nov 30 16:44:33 10.64.165.200 kernel: Removing netfilter NETLINK layer.
Nov 30 16:44:33 10.64.165.200 kernel: ip_tables: (C) 2000-2006 Netfilter Core Team
Nov 30 16:44:33 10.64.165.200 kernel: Netfilter messages via NETLINK v0.30.
Nov 30 16:44:33 10.64.165.200 kernel: ip_conntrack version 2.4 (4096 buckets, 32768 max) - 228 bytes per conntrack
