Rsyslog系統日志管理
課程目標
- 了解日志的級別與作用
- 掌握 rsyslog 服務的本地日志和遠程日志的管理
- 能夠使用 logrotate 程序根據需求對日志進行輪轉
一、常見的系統日志
日志格式:文本日志/二進制日志/數據庫日志
默認的相關日志文件:
/var/log/boot.log 系統引導日志,記錄開機啟動信息
/var/log/dmesg 核心的啟動日志
/var/log/message 系統的日志文件
/var/log/maillog 郵件服務的日志
/var/log/xferlog ftp服務的日志
/var/log/secure 網絡連接及系統登錄的安全信息
/var/log/cron 定時任務的日志
/var/log/wtmp 記錄所有的登入和登出 last -f 查看
/var/log/btmp 記錄失敗的登入嘗試
二、日志管理程序
- 在RHEL6中,syslogd已經被rsyslog取代,它可以將日志寫入數據庫,並可以利用模板和插件控制輸入輸出。
- rsyslog程序管理本地和遠程日志
- 安裝軟件
- 根據需求修改配置文件
- 啟動服務
- 測試驗證
三、日志級別
# man syslog
日志信息分為以下級別,從上到下級別一次降低
none none不是一個等級,它表示不記錄服務的所有信息
0 emerg 系統不可用
1 alert 特別留意的報警信息
2 crit 非常嚴重的狀況
3 err 錯誤信息
4 warning 警告信息
5 notice 稍微需要注意的信息
6 info 正常信息
7 debug 調試信息,開發人員使用
四、日志配置
[root@server ~]# rpm -q rsyslog
rsyslog-5.8.10-8.el6.x86_64
[root@server ~]# rpm -ql rsyslog
/etc/logrotate.d/syslog
/etc/pki/rsyslog
/etc/rc.d/init.d/rsyslog //啟動腳本
/etc/rsyslog.conf //主配置文件
/etc/rsyslog.d //子配置文件
/etc/sysconfig/rsyslog
/sbin/rsyslogd
/usr/share/man/man5/rsyslog.conf.5.gz
/usr/share/man/man8/rsyslogd.8.gz
[root@server ~]# grep -v ^# /etc/rsyslog.conf
$ModLoad imuxsock # provides support for local system logging (e.g. via logger command)
$ModLoad imklog # provides kernel logging support (previously done by rklogd)
$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat
$IncludeConfig /etc/rsyslog.d/*.conf
*.info;mail.none;authpriv.none;cron.none /var/log/messages
authpriv.* /var/log/secure
mail.* -/var/log/maillog
cron.* /var/log/cron
*.emerg *
uucp,news.crit /var/log/spooler
local7.* /var/log/boot.log
$template SpiceTmpl,"%TIMESTAMP%.%TIMESTAMP:::date-subseconds% %syslogtag% %syslogseverity-text%:%msg:::sp-if-no-1st-sp%%msg:::drop-last-lf%\n"
:programname, startswith, "spice-vdagent" /var/log/spice-vdagent.log;SpiceTmpl
1.日志定義相關符號
配置文件中常見的表示符合
. 用來分隔服務和級別
* 任何服務,或者任何級別
= 有等號表示等於某一級別,沒有等號表示大於或者等於某一級別
! 排除操作,前面有相同服務的表達式,這個操作才有意義
代表從前面表達式所包含的內容中排除某些內容
; 用於分隔不同的 服務,級別,組合
, 用於分隔不同服務
- 用於指定目標文件時,代表異步寫入
舉例說明
mail.=info
mail.info mail服務大於等於info級別的日志
mail.info;cron.=info /var/log/test.log
mail,cron.err
cron.=warning
mail,cron.info
cron.info;cron.!=err 012456
0123456 0124567
cron.info;cron.!err 456
0123456 4567
特別說明:
The facility is one of the following keywords: auth,
authpriv, cron, daemon, kern, lpr, mail, mark, news,
security (same as auth), syslog, user, uucp and
local0 through local7.(設備載體)
log facility 設備 設施:用來記錄一種類型日志的日志設備
daemon
auth
authpriv
user
mail
lpr
news
uucp
ftp
local7
本地日志管理ssh
[root@server ~]# man sshd_config
SyslogFacility
Gives the facility code that is used when logging
messages from sshd(8). The possible values are: DAE-
MON, USER, AUTH, AUTHPRIV, LOCAL0, LOCAL1, LOCAL2,
LOCAL3, LOCAL4, LOCAL5, LOCAL6, LOCAL7. The default
is AUTH.
- 更改ssh服務的默認日志記錄載體
- 通過rsyslog程序去管理來自指定設備載體的日志記錄到指定的文件(修改/etc/rsyslog.conf)
- 測試驗證
1.修改ssh服務配置文件
[root@server ~]# cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
[root@server ~]# vim /etc/ssh/sshd_config
SyslogFacility LOCAL6
2.重啟服務
[root@server ~]# service sshd restart
Stopping sshd: [ OK ]
Starting sshd: [ OK ]
3.將來自LOCAL6設備載體日志記錄指定位置(rsyslog)
[root@server ~]# vim /etc/rsyslog.conf
local6.* /var/log/ssh
4.重啟rsyslog服務
[root@server ~]# service rsyslog restart
Shutting down system logger: [ OK ]
Starting system logger: [ OK ]
5.客戶端測試
[root@client ~]# ssh 10.1.1.2
Last login: Fri Apr 26 12:27:33 2019 from 10.1.1.1
[root@server log]# ll ssh
-rw------- 1 root root 0 Apr 26 13:40 ssh
[root@server log]# tail -f ssh
Apr 26 13:42:09 server sshd[2447]: Accepted publickey for root from 10.1.1.3 port 35951 ssh2
Apr 26 13:44:10 server sshd[2447]: Received disconnect from 10.1.1.3: 11: disconnected by user
此時進行ssh訪問,日志會在local6和/var/log/messages里都出現
如果不想記錄到/messages,可修改/etc/rsyslog.conf,添加local6.none,則不再顯示ssh的日志
*.info;mail.none;authpriv.none;cron.none;local6.none /var/log/messages
五、遠程日志管理
目前:把多台服務器的日志遠程記錄到其中一台日志服務器集中化管理,方便對其統一分析和管理
環境:
log-server:10.1.1.2
應用服務器:10.1.1.3
ssh服務服務——>其他人遠程訪問該應用服務器產生ssh服務日志——>遠程記錄到log-server上
client:10.1.1.4
ssh:10.1.1.3——>日志記錄10.1.1.2
需求:把web服務器上的ssh服務日志,遠程記錄到log-server上
思路:
web應用服務器上操作
- 將web服務器上的ssh服務的日志單獨記錄
- 指定ssh服務的設備載體
- 重啟服務
- 將來自於ssh服務的日志設備載體上的日志遠程發送到log-server上
以下操作在log-server上操作
- 通過修改配置文件,打開日志傳輸端口
- 加載相應模塊 tcp | udp
- 打開接收端口 默認514端口
- 啟動服務后日志默認會保存到/var/log/messages
步驟:
以下操作在log-service(10.1.1.2)服務上完成
1.加載相應模塊打開接收端口(可以選擇udp、tcp都打開)
[root@log-server ~]# vim /etc/rsyslog.conf
# Provides UDP syslog reception
$ModLoad imudp
$UDPServerRun 514
# Provides TCP syslog reception
$ModLoad imtcp
$InputTCPServerRun 514
2.重啟服務
service rsyslog restart
[root@log-server ~]# netstat -nltup |grep 514 //驗證端口是否打開
tcp 0 0 0.0.0.0:514 0.0.0.0:* LISTEN 2822/rsyslogd
tcp 0 0 :::514 :::* LISTEN 2822/rsyslogd
udp 0 0 0.0.0.0:514 0.0.0.0:* 2822/rsyslogd
udp 0 0 :::514 :::* 2822/rsyslogd
以下操作在應用服務器完成(10.1.1.3):
1.指定ssh服務的日志文件的設備載體
[root@ssh-server ~]# vim /etc/ssh/sshd_config
SyslogFacility LOCAL0
2.重啟ssh服務
[root@ssh-server ~]# service sshd restart
3.修改/etc/rsyslog.conf來指定ssh服務的日志發送到遠端去
[root@ssh-server ~]# vim /etc/rsyslog.conf
# remote host is: name/ip:port, e.g. 192.168.0.1:514, port optional
#*.* @@remote-host:514
local0.* @10.1.1.2:514 //一個@表示udp,兩個@表示tcp
最關鍵的一步,將日志遠程發送給10.1.1.2
4.重啟rsyslog服務
[root@ssh-server ~]# service rsyslog restart
Shutting down system logger: [ OK ]
Starting system logger: [ OK ]
測試驗證(client:10.1.1.4)
[root@client ~]# ssh 10.1.1.3
The authenticity of host '10.1.1.3 (10.1.1.3)' can't be established.
RSA key fingerprint is a5:98:06:58:84:35:d3:f4:4c:f8:43:a1:a5:12:f5:8e.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '10.1.1.3' (RSA) to the list of known hosts.
root@10.1.1.3's password:
Last login: Fri Apr 26 14:46:31 2019 from 10.1.1.1
[root@log-server ~]# tail -f /var/log/messages
Apr 26 15:12:30 ssh-server sshd[2858]: Accepted password for root from 10.1.1.4 port 58561 ssh2
[root@ssh-server ~]# tail -f /var/log/messages
Apr 26 15:12:30 ssh-server sshd[2858]: Accepted password for root from 10.1.1.4 port 58561 ssh2
(不想記錄就修改/etc/rsyslog.conf,將local0.none加在/var/log/messages那行里)
注意:selinux和防火牆,還有udp和tcp 端口514是否打開
六、日志輪轉
日志輪循(輪轉):日志輪轉,切割,備份,歸檔
- 為什么要日志輪轉?
- 避免日志過大占滿/var/log的文件系統
- 方便日志查看
- 將丟棄系統中最舊的日志文件,以節省空間
- 日志輪轉的程序是logrotate
- logrotate本身不是系統守護進程,它是通過計划crond每天執行
- 如何進行日志輪轉?
- 了解相關配置文件
[root@log-server ~]# rpm -ql logrotate
/etc/cron.daily/logrotate 周期性計划任務
/etc/logrotate.conf 配置文件
/etc/logrotate.d 子配置文件存放路徑
/usr/sbin/logrotate
/usr/share/doc/logrotate-3.7.8
/usr/share/doc/logrotate-3.7.8/CHANGES
/usr/share/doc/logrotate-3.7.8/COPYING
/usr/share/man/man5/logrotate.conf.5.gz
/usr/share/man/man8/logrotate.8.gz
/var/lib/logrotate.status
[root@log-server ~]# cat /etc/logrotate.conf
# see "man logrotate" for details
# rotate log files weekly
weekly
# keep 4 weeks worth of backlogs 保留4周備份日志
rotate 4
# create new (empty) log files after rotating old ones
create
# use date as a suffix of the rotated file 日期作為后綴給舊文件重命名
dateext
# uncomment this if you want your log files compressed
#compress
# RPM packages drop log rotation information into this directory
include /etc/logrotate.d 加載外部目錄
# no packages own wtmp and btmp -- we'll rotate them here
/var/log/wtmp {
monthly
create 0664 root utmp
minsize 1M
rotate 1 保留1份日志文件,每一個月備份一次日志文件
}
/var/log/btmp {
missingok
monthly
create 0600 root utmp
rotate 1
}
# system-specific logs may be also be configured here.
常見的一些參數:
daily 指定轉儲周期為每天
monthly 指定轉儲周期為每月
weekly 每周輪轉一次
rotate 4 同一個文件最多輪轉4次,4次之后就刪除該文件
create 0664 root uttmp 輪轉之后創建新文件,權限是0664,屬於root用戶和utmp組
dateext 用日期來做輪轉之后的文件的后綴名
compress 用gzip對輪轉后的日志進行壓縮
minsize 30K 文件必須大於30k,且周期到了,才會輪轉
size 30K 文件大於30k才會輪轉,不論周期是否已到
missingok 如果日志文件不存在,不報錯
notifempty 如果日志文件是空的,不輪轉
delaycompress 下一次輪轉的時候才壓縮
sharedscripts 不管有多少個文件待輪轉,prerotate和postrotate代碼只執行一次
prerotate 如果符合輪轉的條件,則在輪轉之前執行prerotate和endscript之間的shell代碼
postrotate 輪轉完成后執行postrotate和endscript之間的shell代碼
[root@server~]# cat /etc/logrotate.d/syslog
這個子配置文件,沒有指定的參數都會以默認方式輪轉
/var/log/cron
/var/log/maillog
/var/log/messages
/var/log/secure
/var/log/spooler
{
sharedscripts 不管有多少個文件待輪轉,prerotate和postrotate代碼只執行一次
postrotate 轉換完后執行postrotate和endscirpt之間的shell代碼
/bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
輪轉后對rsyslog的pid進行刷新(但pid其實不變)
endscript
}
思考:為什么輪轉后需要對rsyslog的pid進行刷新?
ll -i 查看文件的inode
-HUP 平滑重啟
不以時間為后綴進行輪轉,在/etc/logrotate.conf/ nodateext
清空環境
重啟服務
結論
后刷新pid的話,logger -t "呵呵" "再見!"會寫入舊文件(messages.1)里面
將這句話放在/bin/kill這條命令后面,會寫入新文件里
最新的文件是messages,第一次強制輪轉后的舊文件是messages.1,cat messages.1會看到logger -t "呵呵" "再見!",到第二次就成messages.2。而第二次輪轉后的messages.1成了第一次輪轉后的messages的老文件。(看時間區別)