一、系統日誌管理 1 系統日誌介紹 1.1 sysklogd 系統日誌服務 CentOS 5 之前版本採用的日誌管理系統服務 klogd: linux kernel 記錄內核日誌 syslogd: system application 記錄應用日誌 1.2 rsyslog 系統日誌服務 rsyslo ...
一、系統日誌管理
1 系統日誌介紹
1.1 sysklogd 系統日誌服務
CentOS 5 之前版本採用的日誌管理系統服務
- klogd: linux kernel 記錄內核日誌
- syslogd: system application 記錄應用日誌
1.2 rsyslog 系統日誌服務
rsyslog是CentOS 6 以後版本的系統管理服務.它提供了高性能,出色的安全性和模塊化設計。 儘管rsyslog最初是常規的syslogd,但已發展成為一種瑞士軍刀式的記錄工具,能夠接受來自各種來源的輸入,並將其轉換,然後輸出到不同的目的地。
當應用有限的處理時,RSYSLOG每秒可以將超過一百萬的消息傳遞到本地目的地。 即使在遠程的目的地和更精細的處理中,性能通常也被認為是“驚人的”。
1.3 ELK
ELK:由Elasticsearch, Logstash, Kibana三個軟體組成
- 非關係型分散式資料庫
- 基於apache軟體基金會jakarta項目組的項目lucene
- Elasticsearch是個開源分散式搜索引擎,可以處理大規模日誌數據,比如:Nginx、Tomcat、系統日誌等功能
- Logstash對日誌進行收集、分析,過濾,並將其存儲供以後使用
- Kibana 可以提供的日誌分析友好的 Web 界面
2 rsyslog 管理
2.1 系統日誌術語
- facility 設施:從功能或程式上對日誌進行歸類
#內置分類 auth, authpriv, cron, daemon,ftp,kern, lpr, mail, news, security(auth),user, uucp, syslog #自定義的分類 local0-local7
- Priority 優先順序別:從低到高排序
debug,info, notice, warn(warning), err(error), crit(critical), alert,emerg(panic)
- logger 命令:可在系統日誌中輸入消息
#範例 [root@rsyslog ~]# logger "this is a test log" [root@rsyslog ~]# cat /var/log/messages Nov 8 03:30:05 rsyslog root[2127]: this is a test log
2.2 rsyslog 相關文件
- 程式包:rsyslog
- 主程式:/usr/sbin/rsyslogd
- CentOS 6:/etc/rc.d/init.d/rsyslog {start|stop|restart|status}
- CentOS 7,8:/usr/lib/systemd/system/rsyslog.service
- 配置文件:/etc/rsyslog.conf,/etc/rsyslog.d/*.conf
- 庫文件: /lib64/rsyslog/*.so
2.3 rsyslog配置文件
/etc/rsyslog.conf 配置文件格式:由三部分組成
- MODULES:相關模塊配置
- GLOBAL DIRECTIVES:全局配置
- RULES:日誌記錄相關的規則配置
RULES配置格式
facility.priority; facility.priority… target
facility格式
* #所有的facility
facility1,facility2,facility3,... #指定的facility列表
priority格式
*: 所有級別
none:沒有級別,即不記錄
PRIORITY:指定級別(含)以上的所有級別
=PRIORITY:僅記錄指定級別的日誌信息
target格式
- 文件路徑:通常在/var/log/,文件路徑前的-表示非同步寫入
- 用戶:將日誌事件通知給指定的用戶,* 表示登錄的所有用戶
- 日誌伺服器:@host,把日誌送往至指定的遠程UDP日誌伺服器 @@host 將日誌發送到遠程TCP日誌伺服器
- 管道: | COMMAND,轉發給其它命令處理
通常的日誌文件的格式
日誌文件有很多,如: /var/log/messages,cron,secure等,基本格式都是類似的。格式如下
事件產生的日期時間 主機 進程(pid):事件內容
範例:將ssh服務的日誌記錄至自定義的local的日誌設備
#修改sshd服務的配置
[root@rocky01 ~]# vim /etc/ssh/sshd_config
#SyslogFacility AUTHPRIV #更改此行
SyslogFacility local6
#修改rsyslog的配置
[root@rocky01 ~]# vim /etc/rsyslog.d/sshd.conf
local6.* /var/log/sshd.log
[root@rocky01 ~]# systemctl reload sshd
[root@rocky01 ~]# systemctl restart rsyslog.service
#測試
#ssh登錄後,查看/var/log/sshd.log有記錄
[root@rocky01 ~]# tail -f /var/log/sshd.log
Nov 7 16:26:12 rocky01 sshd[3903]: Accepted password for root from 10.0.0.1 port 51367 ssh2
2.4 啟用網路日誌服務
啟用網路日誌服務功能,可以將多個遠程主機的日誌,發送到集中的日誌伺服器,方便統一管理。
埠:514
範例:CentOS 8 啟用網路日誌功能
#接收日誌的伺服器
[root@rocky01 ~]# vim /etc/rsyslog.conf
#udp和tcp開啟一個即可(同網段UDP,不同網段TCP)
## MODULES ####
...省略...
# Provides UDP syslog reception
# for parameters see http://www.rsyslog.com/doc/imudp.html
module(load="imudp") # needs to be done just once
input(type="imudp" port="514")
# Provides TCP syslog reception
# for parameters see http://www.rsyslog.com/doc/imtcp.html
module(load="imtcp") # needs to be done just once
input(type="imtcp" port="514")
[root@rocky01 ~]# systemctl restart rsyslog
#在客戶端指定將日誌發送到遠程的TCP、UDP的日誌伺服器
#一個@是UDP,兩個@@是TCP
[root@rocky02 ~]# vim /etc/rsyslog.conf
*.info;mail.none;authpriv.none;cron.none /var/log/messages
*.info;mail.none;authpriv.none;cron.none @@10.0.0.8:514 #TCP
*.info;mail.none;authpriv.none;cron.none @10.0.0.8:514 #UDP
[root@rocky02 ~]# systemctl restart rsyslog
2.5 常見日誌文件
/var/log/secure:系統安全日誌,文本格式,應周期性分析
/var/log/btmp:當前系統上,用戶的失敗嘗試登錄相關的日誌信息,二進位格式,lastb命令進行查看
/var/log/wtmp:當前系統上,用戶正常登錄系統的相關日誌信息,二進位格式,last命令可以查看
/var/log/lastlog:每一個用戶最近一次的登錄信息,二進位格式,lastlog命令可以查看
/var/log/dmesg:CentOS7 之前版本系統引導過程中的日誌信息,文本格式,開機後的硬體變化將不再記錄,也可以通過專用命令dmesg查看,可持續記錄硬體變化的情況
/var/log/boot.log 系統服務啟動的相關信息,文本格式
/var/log/messages :系統中大部分的信息
/var/log/anaconda : anaconda的日誌
3 journalctl 日誌管理工具
CentOS 7 以後版,利用Systemd 統一管理所有 Unit 的啟動日誌。帶來的好處就是,可以只用journalctl一個命令,查看所有日誌(內核日誌和應用日誌)。
日誌的配置文件:
/etc/systemd/journald.conf
journalctl命令格式:
journalctl [OPTIONS...] [MATCHES...]
範例:journalctl用法
#查看所有日誌(預設情況下 ,只保存本次啟動的日誌)
journalctl
#查看內核日誌(不顯示應用日誌)
journalctl -k
#查看系統本次啟動的日誌
journalctl -b
journalctl -b -0
#查看上一次啟動的日誌(需更改設置)
journalctl -b -1
#查看指定時間的日誌
journalctl --since="2017-10-30 18:10:30"
journalctl --since "20 min ago"
journalctl --since yesterday
journalctl --since "2017-01-10" --until "2017-01-11 03:00"
journalctl --since 09:00 --until "1 hour ago"
#顯示尾部的最新10行日誌
journalctl -n
#顯示尾部指定行數的日誌
journalctl -n 20
#實時滾動顯示最新日誌
journalctl -f
#查看指定服務的日誌
journalctl /usr/lib/systemd/systemd
#查看指定進程的日誌
journalctl _PID=1
#查看某個路徑的腳本的日誌
journalctl /usr/bin/bash
#查看指定用戶的日誌
journalctl _UID=33 --since today
二、實戰案例:利用 MySQL 存儲日誌信息
目標
- 利用rsyslog日誌服務,將收集的日誌記錄於MySQL中
環境準備
- 兩台主機
- 10.0.0.128:rsyslog日誌伺服器
- 10.0.0.130:mysql資料庫伺服器
註:可配合網路日誌功能
(1)在rsyslog伺服器上安裝連接mysql模塊相關的程式包
[root@rsyslog ~]# yum install -y rsyslog-mysql
#mysql-createDB.sql需導入到資料庫伺服器
[root@rocky01 ~]# rpm -ql rsyslog-mysql
/usr/lib/.build-id
/usr/lib/.build-id/09
/usr/lib/.build-id/09/927b14f8ca6dfdeca2c2bbe1369b56e6470382
/usr/lib64/rsyslog/ommysql.so
/usr/share/doc/rsyslog/mysql-createDB.sql
#將sql腳本複製到資料庫服庫上
[root@rsyslog ~]# scp /usr/share/doc/rsyslog/mysql-createDB.sql 10.0.0.130:/data
(2)準備MySQL Server
[root@mysql ~]# yum install -y mysql-server
#在mariadb資料庫伺服器上創建相關資料庫和表,並授權rsyslog能連接至當前伺服器
#Syslog庫為mysql-createDB.sql里所創建的庫,創建的用戶名可自定義
[root@mysql ~]# mysql
mysql> source /data/mysql-createDB.sql
mysql> create user 'rsyslog'@'10.0.0.%' identified by '123456';
mysql> grant all on Syslog.* to 'rsyslog'@'10.0.0.%';
(3)配置日誌伺服器將日誌發送至指定資料庫
#配置rsyslog將日誌保存到mysql中
[root@rsyslog ~]# vim /etc/rsyslog.conf
#
####MODULES####
#在 MODULES 語言下麵,如果是 CentOS 8 加下麵行
module(load="ommysql")
#在 MODULES 語言下麵,如果是 CentOS 7,6 加下麵行
$ModLoad ommysql
#在RULES語句塊加下麵行的格式
#分類可自行修改
*.info;mail.none;authpriv.none;cron.none /var/log/messages
*.info;mail.none;authpriv.none;cron.none :ommysql:10.0.0.130,Syslog,rsyslog,123456
[root@rsyslog ~]# systemctl restart rsyslog
(4)測試
#在日誌伺服器上生成日誌
[root@rsyslog ~]# logger "this is a test log"
#在資料庫上查詢到上面的測試日誌
[root@mysql ~]# mysql Syslog
mysql> select * from SystemEvents\G
*************************** 1. row ***************************
ID: 1
CustomerID: NULL
ReceivedAt: 2022-11-08 02:27:49
DeviceReportedTime: 2022-11-08 02:27:49
Facility: 1
Priority: 5
FromHost: rsyslog
Message: this is a test log
...省略...
三、logrotate 日誌轉儲
1 logrotate 介紹
logrotate 程式是一個日誌文件管理工具。用來把舊的日誌文件刪除,並創建新的日誌文件,稱為日誌轉儲或滾動。可以根據日誌文件的大小,也可以根據其天數來轉儲,這個過程一般通過 cron 程式來執行
2 logrotate 配置
軟體包:logrotate
相關文件
- 計劃任務:/etc/cron.daily/logrotate
- 程式文件:/usr/sbin/logrotate
- 配置文件: /etc/logrotate.conf
- 日誌文件:/var/lib/logrotate/logrotate.status
配置文件主要參數如下:
配置參數 說明 compress 通過gzip壓縮轉儲以後的日誌 nocompress 不壓縮 copytruncate 用於還在打開中的日誌文件,把當前日誌備份並截斷 nocopytruncate 備份日誌文件但是不截斷 create mode owner group 轉儲文件,使用指定的許可權,所有者,所屬組創建新的日誌文件 nocreate 不建立新的日誌文件 delaycompress 和compress 一起使用時,轉儲的日誌文件到下一次轉儲時才壓縮 nodelaycompress 覆蓋 delaycompress 選項,轉儲同時壓縮 errors address 專儲時的錯誤信息發送到指定的Email 地址 ifempty 即使是空文件也轉儲,此為預設選項 notifempty 如果是空文件的話,不轉儲 mail address 把轉儲的日誌文件發送到指定的E-mail 地址 nomail 轉儲時不發送日誌文件 olddir directory 轉儲後的日誌文件放入指定目錄,必須和當前日誌文件在同一個文件系統 noolddir 轉儲後的日誌文件和當前日誌文件放在同一個目錄下 prerotate/endscript 在轉儲以前需要執行的命令,這兩個關鍵字必須單獨成行 postrotate/endscript 在轉儲以後需要執行的命令,這兩個關鍵字必須單獨成行 daily 指定轉儲周期為每天 weekly 指定轉儲周期為每周 monthly 指定轉儲周期為每月 rotate count 指定日誌文件刪除之前轉儲的次數,0 指沒有備份,5 指保留5 個備份 tabooext [+] list 讓logrotate不轉儲指定擴展名的文件,預設的擴展名是:.rpm-orig,.rpmsave, v, 和 ~ size size 當日誌文件到達指定的大小時才轉儲,bytes(預設)及KB或MB sharedscripts 預設,對每個轉儲日誌運行prerotate和postrotate腳本,日誌文件的絕對路徑作為第一個參數傳遞給腳本。 這意味著單個腳本可以針對與多個文件匹配的日誌文件條目多次運行(例如/ var / log / news /*.example)。 如果指定此項sharedscripts,則無論有多少個日誌與通配符模式匹配,腳本都只會運行一次 nosharedscripts 針對每一個轉儲的日誌文件,都執行一次prerotate 和 postrotate腳本,此為預設值 missingok 如果日誌不存在,不提示錯誤,繼續處理下一個 nomissingok 如果日誌不存在,提示錯誤,此為預設值
3 logroate 配置範例
範例: 設置nginx的日誌轉儲
cat /etc/logrotate.d/nginx
/var/log/nginx/*.log {
daily
rotate 100
missingok
compress
delaycompress
notifempty
create 644 ngnix nginx
postrotate
if [ -f /app/nginx/logs/nginx.pid ]; then
kill -USR1 `cat /app/nginx/logs/nginx.pid`
fi
endscript
}
範例:對指定日誌手動執行日誌轉儲
#生成測試日誌
[root@centos8 ~]#dd if=/dev/zero of=/var/log/test1.log bs=2M count=1
[root@centos8 ~]#dd if=/dev/zero of=/var/log/test2.log bs=2M count=1
#針對不同的日誌創建轉儲配置文件
[root@centos8 ~]#cat /etc/logrotate.d/test1
/var/log/test1.log {
daily
rotate 5
compress
delaycompress
missingok
size 1M
notifempty
create 640 bin nobody
postrotate
echo `date +%F_%T` >> /data/test1.log
endscript
}
[root@centos8 ~]#cat /etc/logrotate.d/test2
/var/log/test2.log {
daily
rotate 5
compress
delaycompress
missingok
size 1M
notifempty
create 644 root root
postrotate
echo `date +%F_%T` >> /data/test2.log
endscript
}
#針對一個測試日誌,手動執行日誌轉儲
[root@centos8 ~]#logrotate /etc/logrotate.d/test1
[root@centos8 ~]#ll /var/log/test*
-rw-r----- 1 root root 0 Dec 14 16:38 /var/log/test1.log
-rw-r--r-- 1 root root 2097152 Dec 14 16:35 /var/log/test1.log.1
-rw-r--r-- 1 root root 2097152 Dec 14 16:36 /var/log/test2.log
[root@centos8 ~]#ls /data
test1.log
[root@centos8 ~]#cat /data/test1.log
2019-11-12_14:00:14
#對所有日誌進行手動轉儲
[root@centos8 ~]#logrotate /etc/logrotate.conf
[root@centos8 ~]#ll /var/log/test*
-rw-r--r-- 1 bin nobody 0 Nov 12 14:00 /var/log/test1.log
-rw-r--r-- 1 root root 2097152 Nov 12 13:59 /var/log/test1.log.1
-rw-r--r-- 1 root root 0 Nov 12 14:01 /var/log/test2.log
-rw-r--r-- 1 root root 2097152 Nov 12 13:59 /var/log/test2.log-20191112
[root@centos8 ~]#ls /data
test1.log test2.log
[root@centos8 ~]#cat /data/test1.log
2019-11-12_14:01:51