紀錄檔服務管理

2023-07-21 15:00:41

紀錄檔管理

1 系統紀錄檔管理

1 rsyslog系統紀錄檔服務

紀錄檔記錄的內容包括: 歷史事件:時間,地點,人物,事件

Jul 18 14:30:53   # 時間
ubuntu2204        # 地點  (在哪個主機上面)
systemd[1207]:    # 人物  (哪個服務)
Reached target Main User Target.   # 紀錄檔內容

紀錄檔級別:事件的關鍵性程度,Loglevel

rsyslog 是 CentOS6 以後的版本中使用的紀錄檔管理程式,是一個預設安裝的服務,並且預設開機啟動。

rsyslog會預設安裝

[root@rocky8 ~]# rpm -q rsyslog
rsyslog-8.2102.0-7.el8.x86_64

[root@ubuntu2204 ~]#dpkg -l rsyslog
Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
||/ Name           Version             Architecture Description
+++-==============-===================-============-=========================================
ii  rsyslog        8.2112.0-2ubuntu2.2 amd64        reliable system and kernel logging daemon

1.1 ELK 紀錄檔管理

rsyslog 紀錄檔服務與 ELK 紀錄檔服務的區別: rsyslog 主要用於單機紀錄檔管理,ELK 主要用於分散式叢集環境中的紀錄檔管理。

2 rsyslog紀錄檔管理(分類和級別)

系統紀錄檔的相關概念

facility: 設施,從功能或程式上對紀錄檔進行歸類 (分類)

在一臺主機上會同時執行多個服務和軟體,每個服務或軟體都有可能會產生大量的紀錄檔,如果每個服務 或軟體產生的紀錄檔都獨立存放管理,那檔案數量就太多了,如果都放到一個檔案中,似乎也不是很合 適,所以 rsyslog 將紀錄檔進行了分類,相同型別的紀錄檔放一個檔案,這樣便於管理。

#syslog 內建分類
LOG_AUTH         #auth 安全和認證相關的紀錄檔
LOG_AUTHPRIV     #authpriv 安全和認證相關的紀錄檔,私有
LOG_CRON         #cron 系統定時任務 crontab 與 at 產生的相關紀錄檔
LOG_DAEMON       #daemon 各守護行程產生的紀錄檔
LOG_FTP          #ftp ftp守護行程產生的紀錄檔
LOG_KERN         #kern 核心產生的紀錄檔
LOG_LOCAL0 -- LOG_LOCAL7         #local0-local7 自定義分類
LOG_LPR          #lpr 列印服務紀錄檔
LOG_MAIL         #mail 郵件服務紀錄檔
LOG_NEWS         # news 網路新聞服務產生的紀錄檔
LOG_SYSLOG       # syslog syslogd 服務自己的紀錄檔
LOG_USER         #user 使用者等級
LOG_UUCP         #uucp uucp子系統的紀錄檔資訊
*                #萬用字元,代表所有分類

Priority: 優先順序別,從高到低排序(等級)

rsyslog 在記錄紀錄檔的時候,將各種產生紀錄檔的事件和行為進行了優先順序的排序,使用者可以根據不同環 境(測試/生產)和需求,設定不同的級別來記錄紀錄檔,這樣可以保證,記錄下來的內容都是是我們想要的。

#syslog 內建優先順序分類,從高到低,如果在記錄紀錄檔時,設定了優先順序,則只會記錄設定的優先順序和高於設定優先順序的紀錄檔
LOG_EMERG      #emerg/panic 緊急,致命錯誤
LOG_ALERT      #alert 告警,當前狀態必須立即進行糾正
LOG_CRIT       #crit 關鍵狀態的警告,例如 硬體故障
LOG_ERR        #err/error 其它錯誤
LOG_WARNING    #warning/warn 警告級別的資訊
LOG_NOTICE     #notice 通知級別的資訊,
LOG_INFO       #info 通告級別的資訊
LOG_DEBUG      #debug 偵錯程式時的資訊
*              #所有級別的紀錄檔
none           #不需要任何紀錄檔
               #panic,error,warn在新版中被棄,不建議使用

3 rsyslog服務組成

#檢視所有 rsyslog 包中的檔案
[root@ubuntu ~]# dpkg -L rsyslog
/usr/sbin/rsyslogd                        #主程式
/lib/systemd/system/rsyslog.service       #服務指令碼
/etc/rsyslog.conf                         #主組態檔
/etc/rsyslog.d/*.conf                     #組態檔目錄中的組態檔 
/usr/lib/x86_64-linux-gnu/rsyslog/*.so    #庫檔案
# 在主組態檔中,將設定分為三個部份,分別是模組(MODULES),全域性設定(GLOBAL DIRECTIVES), 紀錄檔 記錄規則設定(RULES)

[root@ubuntu ~]# cat /etc/rsyslog.conf

# ubuntu 系統中,預設 rule 規則是單獨放在一個檔案中的
# Default logging rules can be found in /etc/rsyslog.d/50-default.conf

#################
#### MODULES ####
#################
#rsyslog 在安裝是有很多支援模組,但預設不是所有模組都開啟,如果有需要,寫在此處即可

module(load="imuxsock")
#module(load="immark")

#UDP模組,預設沒有啟用
#module(load="imudp")
#input(type="imudp" port="514")

#TCP 模組,預設沒有啟用
#module(load="imtcp")
#input(type="imtcp" port="514")

#核心紀錄檔需要的模組
module(load="imklog" permitnonkernelfacility="on")
###########################
#### GLOBAL DIRECTIVES ####
###########################


#預設紀錄檔模板
$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat

#預設開啟重複過濾
$RepeatedMsgReduction on

#建立紀錄檔檔案的預設許可權和屬主屬組
$FileOwner syslog
$FileGroup adm
$FileCreateMode 0640
$DirCreateMode 0755
$Umask 0022
$PrivDropToUser syslog
$PrivDropToGroup syslog

#工作目錄,預設目錄為空
$WorkDirectory /var/spool/rsyslog

#獨立組態檔參照目錄
$IncludeConfig /etc/rsyslog.d/*.conf

rule 設定規則

每一行 rule 由兩列組成,分別是選擇器和處理動作,選擇器將過濾後的紀錄檔交由處理動作處理;

  • 選擇器可以同時有多個,用分號分隔,處理動作也可以同時有多個,用 & 分隔,處理動作中可以指定模 板,不同的模板會生成不同的紀錄檔內容,模板可以自定義。
  • 選擇器有以下幾種定義方式:
  • 用分類和優先順序來過濾,同一條 rule 中,分類和優先順序都可以有多個,用逗號分隔
  • 基於紀錄檔內容中的指定欄位來過濾
  • 基於表示式構建指令碼來過濾

處理動作有以下幾種:

  • 輸出到紀錄檔檔案或某個特定裝置
  • 儲存到資料庫
  • 傳送給指定使用者,該使用者必須己登入,可以同時指定多個使用者,用逗號分隔
  • 傳送到遠端主機
  • 通過管道傳送給其它命令
  • 丟棄紀錄檔,不處理
# * 所有 priority
# none         沒有任何 priority,即不記錄
# priority     具體的 priority,處理指定級別和指定級別以上的所有級別紀錄檔
# *priority    所有priority,處理指定級別和指定級別以上的所有級別紀錄檔
# =priority  僅處理指定級別紀錄檔
# *=priority 所有處理指定級別紀錄檔
# !priority  排除指定的 priority,這種寫法不能單獨使用


# action-輸出到紀錄檔檔案或裝置
# /path/file   將紀錄檔內容寫到指定檔案
# -/path/file  將紀錄檔內容寫到指定檔案,非同步寫入
# /dev/null    將紀錄檔內容輸出到指定裝置


非同步寫入(Asynchronous Writing)是一種資料寫入處理方式,它將寫入操作交給後臺任務或其他執行緒來處理,而不會阻塞當前執行緒或程序的執行。非同步寫入可以提高程式的效能和響應性,並確保資料的一致性。

在傳統的同步寫入(Synchronous Writing)中,寫入操作會阻塞當前執行緒,直到資料寫入完成。這在某些情況下可能會導致效能瓶頸,尤其是在對儲存媒介進行大量寫入時。

相比之下,非同步寫入將寫入操作放入後臺進行,當前執行緒可以繼續執行其他任務。這可以提高程式的並行性和吞吐量。非同步寫入通常涉及使用緩衝區或佇列來儲存待寫入的資料,而後臺任務會週期性或基於特定條件來處理這些資料,並將其寫入目標位置。

非同步寫入的一個重要概念是"寫入完成通知",即在後臺任務完成寫入操作後通知相關執行緒或程序。這可以通過回撥函數、事件或其他機制來實現。

值得注意的是,雖然非同步寫入可以提高效能,但也需要考慮一些問題,比如資料一致性、錯誤處理和記憶體管理等。因此,在實現非同步寫入時需要權衡考慮這些因素,並採用適當的機制來處理。


#action-傳送給指定使用者
 root        "將紀錄檔內容傳送給使用者 root
 root,tom    "將紀錄檔內容傳送給使用者 root 和 tom
 *           "將紀錄檔內容傳送給所有己登入使用者


#action-傳送到遠端主機
 @192.168.2.123                    "使用 UDP 協定傳送到遠端主機,預設埠514
 @@log.magedu.com:256              "使用 TCP 協定傳送到遠端主機 256 埠,預設埠514
 @(z6)[fe80::20c:29ff:fe7e:ce82]   "使用 UPD 協定傳送到遠端主機(IPV6地址),啟用zlib壓縮,壓縮級別為6
#  Default rules for rsyslog.
#
#           For more information see rsyslog.conf(5) and /etc/rsyslog.conf

#
# First some standard log files.  Log by facility.
#
auth,authpriv.*         /var/log/auth.log      " 登入驗證相關的紀錄檔記錄在auth.log中

*.*;auth,authpriv.none      -/var/log/syslog   
                  "在這個規則中,*.* 表示所有裝置(facility)和所有紀錄檔級別(priority)的紀錄檔訊息都將匹配到這條規則。
                  "; 表示之後是要應用的過濾條件。"
                  "auth,authpriv.none 表示 auth 和 authpriv 裝置的紀錄檔訊息不會匹配到這條規則,
                  "們將被排除在外。
                  "而 none 則表示不使用任何特定的紀錄檔級別過濾條件。
                  "所以這條設定規則的意思是,除了 auth 和 authpriv 裝置之外的所有裝置的所有紀錄檔訊息都會被傳送並進行處理。 

#cron.*             /var/log/cron.log
#daemon.*           -/var/log/daemon.log
kern.*              -/var/log/kern.log        " 核心所有紀錄檔都記錄在kern.log 中,非同步寫
#lpr.*              -/var/log/lpr.log
mail.*              -/var/log/mail.log        " 郵件相關紀錄檔記錄在 mail.log 中,非同步寫
#user.*             -/var/log/user.log

#
# Logging for the mail system.  Split it up so that
# it is easy to write scripts to parse these files.
#
#mail.info          -/var/log/mail.info
#mail.warn          -/var/log/mail.warn
mail.err            /var/log/mail.err          " 郵件服務 err 及以上的紀錄檔記錄在 mail.err 中

#
# Some "catch-all" log files.
#
#*.=debug;\
#   auth,authpriv.none;\
#   news.none;mail.none -/var/log/debug
#*.=info;*.=notice;*.=warn;\
#   auth,authpriv.none;\
#   cron,daemon.none;\
#   mail,news.none      -/var/log/messages

#
# Emergencies are sent to everybody logged in.
#
*.emerg             :omusrmsg:*               " 所有致命錯誤資訊,呼叫omusrmsg 模組發給所有登入使用者

#
# I like to have messages displayed on the console, but only on a virtual
# console I usually leave idle.
#
#daemon,mail.*;\
#   news.=crit;news.=err;news.=notice;\
#   *.=debug;*.=info;\
#   *.=notice;*.=warn   /dev/tty8

紀錄檔內容和模板

rocky中的紀錄檔內容

[16:25:32 root@rocky86[ ~]#tail /var/log/messages

Jul 18 17:31:48 rocky86 NetworkManager[971]: <info>  [1689672708.4541] dhcp4 (eth0): state changed new lease, address=10.0.0.153
Jul 18 17:31:48 rocky86 dbus-daemon[963]: [system] Activating via systemd: service name='org.freedesktop.nm_dispatcher' unit='dbus-org.freedesktop.nm-dispatcher.service' requested by ':1.9' (uid=0 pid=971 comm="/usr/sbin/NetworkManager --no-daemon ")
Jul 18 17:31:48 rocky86 systemd[1]: Starting Network Manager Script Dispatcher Service...
Jul 18 17:31:48 rocky86 dbus-daemon[963]: [system] Successfully activated service 'org.freedesktop.nm_dispatcher'
Jul 18 17:31:48 rocky86 systemd[1]: Started Network Manager Script Dispatcher Service.
Jul 18 17:31:58 rocky86 systemd[1]: NetworkManager-dispatcher.service: Succeeded.
Jul 18 17:39:29 rocky86 systemd[1]: Starting dnf makecache...
Jul 18 17:39:29 rocky86 dnf[2515]: Metadata cache refreshed recently.
Jul 18 17:39:29 rocky86 systemd[1]: dnf-makecache.service: Succeeded.
Jul 18 17:39:29 rocky86 systemd[1]: Started dnf makecache.

ubuntu中的紀錄檔內容

[root@ubuntu2204 ~]#tail /var/log/syslog

Jul 18 17:31:44 ubuntu2204 systemd-networkd[848]: eth0: DHCPv6 lease lost
Jul 18 17:31:44 ubuntu2204 systemd-timesyncd[683]: No network connectivity, watching for changes.
Jul 18 17:31:50 ubuntu2204 kernel: [11072.020378] e1000: eth0 NIC Link is Up 1000 Mbps Full Duplex, Flow Control: None
Jul 18 17:31:50 ubuntu2204 systemd-networkd[848]: eth0: Gained carrier
Jul 18 17:31:50 ubuntu2204 systemd-timesyncd[683]: Network configuration changed, trying to establish connection.
Jul 18 17:31:50 ubuntu2204 systemd-networkd[848]: eth0: DHCPv4 address 10.0.0.150/24 via 10.0.0.2
Jul 18 17:31:50 ubuntu2204 systemd-timesyncd[683]: Network configuration changed, trying to establish connection.
Jul 18 17:31:50 ubuntu2204 systemd-resolved[850]: Using degraded feature set UDP instead of UDP+EDNS0 for DNS server 10.0.0.2.
Jul 18 17:31:51 ubuntu2204 systemd-timesyncd[683]: Initial synchronization to time server 91.189.94.4:123 (ntp.ubuntu.com).
Jul 18 17:35:02 ubuntu2204 CRON[2306]: (root) CMD (command -v debian-sa1 > /dev/null && debian-sa1 1 1)

4 紀錄檔說明 及 相關工具

rocky中常見紀錄檔說明

[17:40:52 root@rocky86[ ~]#cat /etc/rsyslog.conf | grep -Ev '^#|^$'
module(load="imuxsock" 	  # provides support for local system logging (e.g. via logger command)
       SysSock.Use="off") # Turn off message reception via local log socket; 
			  # local messages are retrieved through imjournal now.
module(load="imjournal" 	    # provides access to the systemd journal
       StateFile="imjournal.state") # File to store the position in the journal
global(workDirectory="/var/lib/rsyslog")
module(load="builtin:omfile" Template="RSYSLOG_TraditionalFileFormat")
include(file="/etc/rsyslog.d/*.conf" mode="optional")



*.info;mail.none;authpriv.none;cron.none                /var/log/messages     " #除了mail,authpriv,cron 之外都記錄
authpriv.*                                              /var/log/secure       " 安全認證相關紀錄檔
mail.*                                                  -/var/log/maillog     " 郵件服務相關紀錄檔
cron.*                                                  /var/log/cron         " 定時任務相關紀錄檔
*.emerg                                                 :omusrmsg:*           " 所有致命錯誤資訊,呼叫omusrmsg發給所有登入使用者
uucp,news.crit                                          /var/log/spooler      " uucp,新聞相關紀錄檔
local7.*                                                /var/log/boot.log     " 作業系統啟動流程紀錄檔

Ubuntu中常見紀錄檔說明

[root@ubuntu2204 ~]#cat /etc/rsyslog.d/*conf | grep -Ev '^#|^$'

:msg,contains,"[UFW " /var/log/ufw.log                          # ufw 服務紀錄檔

:syslogtag, isequal, "[CLOUDINIT]" /var/log/cloud-init.log      # cloud-init 服務紀錄檔

& stop              #其它不處理

auth,authpriv.*	   		/var/log/auth.log

*.*;auth,authpriv.none		-/var/log/syslog         
    # auth,authpriv 之外的紀錄檔

kern.*				-/var/log/kern.log       # 核心產生的紀錄檔

mail.*				-/var/log/mail.log       # 郵件服務紀錄檔

mail.err			/var/log/mail.err        # 郵件服務err(含)以上紀錄檔

*.emerg				:omusrmsg:*              # 所有致命錯誤資訊,呼叫omusrmsg發給所有登入使用者
紀錄檔檔案 相關命令 備註
/var/log/btmp lastb 當前系統上,使用者的失敗嘗試登入相關的紀錄檔 ( bad logins ),二 進位制格式
/var/log/lastlog lastlog 每一個使用者最近一次的登入資訊,二進位制格式
/var/log/wtmp last 當前系統上,使用者正常登入系統的相關紀錄檔資訊 ( who was logged in ),二進位制格式
#在 rocky 中檢視
[root@rocky ~]# ll /var/log/{btmp,lastlog,wtmp}
-rw-------  1 root utmp      0 May  3 14:45 /var/log/btmp
-rw-rw-r--. 1 root utmp 295212 May  3 13:59 /var/log/lastlog
-rw-rw-r--. 1 root utmp 496896 May  3 13:59 /var/log/wtmp
[root@rocky ~]# file /var/log/{btmp,lastlog,wtmp}
/var/log/btmp:   empty
/var/log/lastlog: data
/var/log/wtmp:   firmware 0 v0 (revision 0)   V2, 0 bytes or less, UNKNOWN2 
0x6c382e78, at 0x0 0 bytes , at 0x0 0 bytes

#在 ubuntu 中檢視
[root@ubuntu ~]# ll /var/log/{btmp,lastlog,wtmp}
-rw-rw---- 1 root utmp      0 May  1 12:44 /var/log/btmp
-rw-rw-r-- 1 root utmp 292292 May  3 06:00 /var/log/lastlog
-rw-rw-r-- 1 root utmp  17664 May  3 06:00 /var/log/wtmp
[root@ubuntu ~]# file /var/log/{btmp,lastlog,wtmp}
/var/log/btmp:   empty
/var/log/lastlog: data
/var/log/wtmp:   data
last -x    # 顯示系統關機項和執行級別更改
[root@ubuntu2204 ~]#last -x
root     pts/0        10.0.0.1         Tue Jul 18 14:30   still logged in
runlevel (to lvl 5)   5.15.0-76-generi Tue Jul 18 14:27   still running
reboot   system boot  5.15.0-76-generi Tue Jul 18 14:27   still running

dmesg命令

dmesg命令用來檢視主機硬體相關紀錄檔

logger命令

logger 命令可以手動生成相關紀錄檔

logger [options] [<message>]
#常用選項
-p|--priority #指定優先順序
-f|--file #從檔案中讀取紀錄檔內容
-t|--tag #指定紀錄檔tag
-n|--server #指定遠端主機IP或主機名
-P|--port #指定遠端主機埠
-T|--tcp #指定使用TCP協定傳輸
-d|--udp #指定使用UDP協定傳輸

#無選項
[root@ubuntu ~]# logger "this is test msg"
root@ubuntu2204:~# tail -n 1 /var/log/syslog
May  3 07:07:08 ubuntu2204 root: this is test msg

[root@ubuntu ~]# cat test.txt 
this msg from test.txt

#從檔案中讀取,指定tag,指定優先順序
[root@ubuntu ~]# logger -t test -f test.txt -p error
[root@ubuntu ~]# tail -n 1 /var/log/syslog
May  4 14:09:53 ubuntu test: this msg from test.txt

5 在本機中自定義服務紀錄檔

# sshd服務預設是歸屬於AUTH 分類,預設級別是 INFO
[root@ubuntu2204 ~]#vim /etc/ssh/sshd_config
# Logging
#SyslogFacility AUTH
#LogLevel INFO

#根據設定,此紀錄檔記錄在 /var/log/auth.log 中
[root@ubuntu ~]# cat /etc/rsyslog.d/50-default.conf | grep "^auth"
auth,authpriv.* /var/log/auth.log

#重啟服務
[root@ubuntu ~]# systemctl restart sshd

# 檢視紀錄檔,能看到相關內容
[root@ubuntu2204 ~]#tail -f /var/log/auth.log
Jul 18 19:05:01 ubuntu2204 CRON[2564]: pam_unix(cron:session): session opened for user root(uid=0) by (uid=0)
Jul 18 19:05:01 ubuntu2204 CRON[2564]: pam_unix(cron:session): session closed for user root
Jul 18 19:15:01 ubuntu2204 CRON[2579]: pam_unix(cron:session): session opened for user root(uid=0) by (uid=0)
Jul 18 19:15:01 ubuntu2204 CRON[2579]: pam_unix(cron:session): session closed for user root
Jul 18 19:17:01 ubuntu2204 CRON[2582]: pam_unix(cron:session): session opened for user root(uid=0) by (uid=0)
Jul 18 19:17:01 ubuntu2204 CRON[2582]: pam_unix(cron:session): session closed for user root
Jul 18 19:18:52 ubuntu2204 sshd[931]: Received signal 15; terminating.
Jul 18 19:18:53 ubuntu2204 sshd[2590]: Server listening on 0.0.0.0 port 22.
Jul 18 19:18:53 ubuntu2204 sshd[2590]: Server listening on :: port 22.
Jul 18 19:18:54 ubuntu2204 sshd[2590]: Received signal 15; terminating.
.


#修改 sshd 服務紀錄檔的設定項,分類改到 LOCAL6,級別不改
[root@ubuntu2204 ~]#vim /etc/ssh/sshd_config
# Logging
#SyslogFacility AUTH
#LogLevel INFO
SyslogFacility LOCAL6

#新增組態檔,local6 分類的紀錄檔都寫到 sshd.log 檔案中
[root@ubuntu2204 ~]#vim /etc/rsyslog.d/sshd.conf
local6.* 		/var/log/sshd.log

#檢視還沒此紀錄檔檔案
[root@ubuntu2204 ~]#ll /var/log/sshd.log
ls: cannot access '/var/log/sshd.log': No such file or directory

# 重啟服務
[root@ubuntu2204 ~]#systemctl restart rsyslog
[root@ubuntu2204 ~]#systemctl restart sshd

# 再次檢視
[root@ubuntu2204 ~]#ll /var/log/sshd.log
-rw-r----- 1 syslog adm 147 Jul 18 19:29 /var/log/sshd.log

# 測試
[root@ubuntu2204 ~]#ssh 127.1
The authenticity of host '127.0.0.1 (127.0.0.1)' can't be established.
ED25519 key fingerprint is SHA256:ukriQdQqMD2eCwtwBcNiGPc3pM+FTeEhc3Jhq28/F4Y.
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])?

# 檢視紀錄檔
[root@ubuntu2204 ~]#tail /var/log/sshd.log 
Jul 18 19:29:36 ubuntu2204 sshd[2704]: Server listening on 0.0.0.0 port 22.
Jul 18 19:29:36 ubuntu2204 sshd[2704]: Server listening on :: port 22.
Jul 18 19:29:55 ubuntu2204 sshd[2707]: Connection closed by 127.0.0.1 port 47752 [preauth]

# 測試
[root@ubuntu2204 ~]#logger -p local6.info "hello sshd"

# 檢視紀錄檔
[root@ubuntu2204 ~]#tail -l /var/log/sshd.log 
Jul 18 19:29:36 ubuntu2204 sshd[2704]: Server listening on 0.0.0.0 port 22.
Jul 18 19:29:36 ubuntu2204 sshd[2704]: Server listening on :: port 22.
Jul 18 19:29:55 ubuntu2204 sshd[2707]: Connection closed by 127.0.0.1 port 47752 [preauth]
Jul 18 19:33:36 ubuntu2204 root: hello sshd    # 系統預設自動去重

6 使用紀錄檔網路轉發

主機清單

主機ip 作業系統 角色
10.0.0.150 ubuntu client-1
10.0.0.159 rocky client-2
10.0.0.153 rocky log-server

設定 client-1主機紀錄檔遠端轉發

# 修改主機名
[root@ubuntu2204 ~]#hostnamectl set-hostname client-1

# 重啟服務
[17:30:38 root@rocky86[ ~]#systemctl restart rsyslog

# 修改10.0.0.153主機上組態檔 把udp tcp放行
[17:25:03 root@rocky86[ ~]#vim /etc/rsyslog.conf
# 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")

# 重啟服務
[17:30:38 root@rocky86[ ~]#systemctl restart rsyslog

# 檢視埠 已經放出
[17:31:16 root@rocky86[ ~]#ss -tunlp | grep 514
udp   UNCONN 0      0            0.0.0.0:514        0.0.0.0:*    users:(("rsyslogd",pid=2395,fd=4))     # ipv4                                        
udp   UNCONN 0      0               [::]:514           [::]:*    users:(("rsyslogd",pid=2395,fd=5))     # ipv6                                      
tcp   LISTEN 0      25           0.0.0.0:514        0.0.0.0:*    users:(("rsyslogd",pid=2395,fd=6))                                             
tcp   LISTEN 0      25              [::]:514           [::]:*    users:(("rsyslogd",pid=2395,fd=7))

# 新增組態檔    client-1
[root@client-1 ~]#ls /etc/rsyslog.
rsyslog.conf   rsyslog.d/     #  兩個檔案內都可以新增    rsyslog.conf是主組態檔    rsyslog.d 是空的

#設定遠端轉發,轉發到10.0.0.153的udp協定514埠   
[root@client-1 ~]#vim /etc/rsyslog.d/net.conf
*.info @10.0.0.153:514   #預設是514 此處可以成略不寫    ip地址是轉發主機的 log-server

#重啟服務
[root@client-1 ~]#systemctl restart rsyslog

# 測試
[root@client-1 ~]#logger "this msg from client-1"

# 在 log-server主機檢視  已經收到
[19:00:53 root@rocky86[ log]#cat /var/log/messages | grep client-1
Jul 19 18:57:17 client-1 systemd[1]: Stopping System Logging Service...
Jul 19 18:57:17 client-1 rsyslogd: [origin software="rsyslogd" swVersion="8.2112.0" x-pid="2051" x-info="https://www.rsyslog.com"] exiting on signal 15.
Jul 19 18:57:17 client-1 systemd[1]: rsyslog.service: Deactivated successfully.
Jul 19 18:57:17 client-1 systemd[1]: Stopped System Logging Service.
Jul 19 18:57:17 client-1 systemd[1]: Starting System Logging Service...
Jul 19 18:57:32 client-1 systemd[1]: Started System Logging Service.
Jul 19 18:57:32 client-1 rsyslogd: imuxsock: Acquired UNIX socket '/run/systemd/journal/syslog' (fd 3) from systemd.  [v8.2112.0]
Jul 19 18:57:32 client-1 rsyslogd: rsyslogd's groupid changed to 113
Jul 19 18:57:32 client-1 rsyslogd: rsyslogd's userid changed to 107
Jul 19 18:57:32 client-1 rsyslogd: [origin software="rsyslogd" swVersion="8.2112.0" x-pid="2060" x-info="https://www.rsyslog.com"] start
Jul 19 18:57:34 client-1 root: this msg from client-1


# client-1 主機上也有該紀錄檔
[root@client-1 ~]#cat /var/log/syslog | grep client-1
Jul 19 18:57:32 client-1 rsyslogd: imuxsock: Acquired UNIX socket '/run/systemd/journal/syslog' (fd 3) from systemd.  [v8.2112.0]
Jul 19 18:57:32 client-1 rsyslogd: rsyslogd's groupid changed to 113
Jul 19 18:57:32 client-1 rsyslogd: rsyslogd's userid changed to 107
Jul 19 18:57:32 client-1 rsyslogd: [origin software="rsyslogd" swVersion="8.2112.0" x-pid="2060" x-info="https://www.rsyslog.com"] start
Jul 19 18:57:34 client-1 root: this msg from client-1

設定client-2主機紀錄檔遠端轉發

# 修改主機名
[root@rocky8 ~]# hostnamectl set-hostname client-2

#設定遠端轉發,轉發到10.0.0.153的tcp協定514埠
[root@client-2 etc]# vim /etc/rsyslog.d/net.conf
*.info  @@10.0.0.153:514

# 測 試
[root@client-2 etc]# logger "this msg from client-2"

# 重啟服務
[root@client-2 ~]# systemctl restart rsyslog

# 在本機檢視
[root@client-2 etc]# tail -l /var/log/messages
Jul 19 19:14:05 client-2 systemd[1]: Stopping System Logging Service...
Jul 19 19:14:05 client-2 rsyslogd[3979]: [origin software="rsyslogd" swVersion="8.2102.0-7.el8" x-pid="3979" x-info="https://www.rsyslog.com"] exiting on signal 15.
Jul 19 19:14:05 client-2 systemd[1]: rsyslog.service: Succeeded.
Jul 19 19:14:05 client-2 systemd[1]: Stopped System Logging Service.
Jul 19 19:14:05 client-2 systemd[1]: Starting System Logging Service...
Jul 19 19:14:07 client-2 NetworkManager[1193]: <info>  [1689765247.6845] dhcp4 (eth0): state changed new lease, address=10.0.0.159
Jul 19 19:14:31 client-2 rsyslogd[4033]: [origin software="rsyslogd" swVersion="8.2102.0-7.el8" x-pid="4033" x-info="https://www.rsyslog.com"] start
Jul 19 19:14:31 client-2 systemd[1]: Started System Logging Service.
Jul 19 19:14:31 client-2 rsyslogd[4033]: imjournal: journal files changed, reloading...  [v8.2102.0-7.el8 try https://www.rsyslog.com/e/0 ]
Jul 19 19:14:51 client-2 root[4051]: this msg from client-2

# 在log-server檢視   
[20:07:38 root@rocky86[ ~]#tail -f /var/log/messages
Jul 19 20:12:21 localhost root[4932]: this msg from client-2fddfsfdsfddffdfdfddfs
Jul 19 20:13:59 rocky86 NetworkManager[977]: <info>  [1689768839.8500] dhcp4 (eth0): state changed new lease, address=10.0.0.153
Jul 19 20:14:06 rocky8 NetworkManager[1171]: <info>  [1689768846.0514] dhcp4 (eth0): state changed new lease, address=10.0.0.157
Jul 19 20:14:07 localhost NetworkManager[1193]: <info>  [1689768847.6874] dhcp4 (eth0): state changed new lease, address=10.0.0.159
Jul 19 20:14:21 localhost root[4953]: this msg from client-2

使用MySQL 資料庫轉儲紀錄檔

任務:將client-2和client-3的紀錄檔打到log-server,然後mysql-server儲存三臺主機的紀錄檔檔案

主機ip 作業系統 角色
10.0.0.159 rocky client-2
10.0.0.153 rocky client-3
10.0.0.150 ubuntu log-server
10.0.0.162 ubuntu mysql-server
# 在 log-server 上安裝 rsyslog 的 mysql 包
[09:15:31 root@rocky86[ ~]#apt install rsyslog-mysql

# 檢視包檔案
[root@log-server rsyslog.d]#dpkg -L rsyslog-mysql
/.
/usr
/usr/lib
/usr/lib/x86_64-linux-gnu
/usr/lib/x86_64-linux-gnu/rsyslog
/usr/lib/x86_64-linux-gnu/rsyslog/ommysql.so
/usr/share
/usr/share/dbconfig-common
/usr/share/dbconfig-common/data
/usr/share/dbconfig-common/data/rsyslog-mysql
/usr/share/dbconfig-common/data/rsyslog-mysql/install
/usr/share/dbconfig-common/data/rsyslog-mysql/install/mysql
/usr/share/doc
/usr/share/doc/rsyslog-mysql
/usr/share/doc/rsyslog-mysql/copyright
/usr/share/rsyslog-mysql
/usr/share/rsyslog-mysql/rsyslog-mysql.conf.template
/usr/share/doc/rsyslog-mysql/NEWS.Debian.gz
/usr/share/doc/rsyslog-mysql/changelog.Debian.gz

#  ubuntu中檢視檔案 並複製檔案匯入資料庫
[root@log-server rsyslog.d]#cat /usr/share/dbconfig-common/data/rsyslog-mysql/install/mysql
CREATE TABLE IF NOT EXISTS SystemEvents
(
        ID int unsigned not null auto_increment primary key,
        CustomerID bigint,
        ReceivedAt datetime NULL,
        DeviceReportedTime datetime NULL,
        Facility smallint NULL,
        Priority smallint NULL,
        FromHost varchar(60) NULL,
        Message text,
        NTSeverity int NULL,
        Importance int NULL,
        EventSource varchar(60),
        EventUser varchar(60) NULL,
        EventCategory int NULL,
        EventID int NULL,
        EventBinaryData text NULL,
        MaxAvailable int NULL,
        CurrUsage int NULL,
        MinUsage int NULL,
        MaxUsage int NULL,
        InfoUnitID int NULL ,
        SysLogTag varchar(60),
        EventLogType varchar(60),
        GenericFileName VarChar(60),
        SystemID int NULL
);

CREATE TABLE IF NOT EXISTS SystemEventsProperties
(
        ID int unsigned not null auto_increment primary key,
        SystemEventID int NULL ,
        ParamName varchar(255) NULL ,
        ParamValue text NULL
);

# 在mysql-server主機上進入資料庫
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.00 sec)


# 建立資料庫
mysql> create database rsyslog;

# 檢視資料庫為空
mysql> use rsyslog;
Database changed

# 接上一步匯入SQL表格資料
mysql> CREATE TABLE IF NOT EXISTS SystemEvents
    -> (
    ->         ID int unsigned not null auto_increment primary key,
    ->         CustomerID bigint,
    ->         ReceivedAt datetime NULL,
    ->         DeviceReportedTime datetime NULL,
    ->         Facility smallint NULL,
    ->         Priority smallint NULL,
    ->         FromHost varchar(60) NULL,
    ->         Message text,
    ->         NTSeverity int NULL,
    ->         Importance int NULL,
    ->         EventSource varchar(60),
    ->         EventUser varchar(60) NULL,
    ->         EventCategory int NULL,
    ->         EventID int NULL,
    ->         EventBinaryData text NULL,
    ->         MaxAvailable int NULL,
    ->         CurrUsage int NULL,
    ->         MinUsage int NULL,
    ->         MaxUsage int NULL,
    ->         InfoUnitID int NULL ,
    ->         SysLogTag varchar(60),
    ->         EventLogType varchar(60),
    ->         GenericFileName VarChar(60),
    ->         SystemID int NULL
    -> );
 text NULL
);
Query OK, 0 rows affected (0.02 sec)

mysql> 
mysql> CREATE TABLE IF NOT EXISTS SystemEventsProperties
    -> (
    ->         ID int unsigned not null auto_increment primary key,
    ->         SystemEventID int NULL ,
    ->         ParamName varchar(255) NULL ,
    ->         ParamValue text NULL
    -> );
Query OK, 0 rows affected (0.02 sec)

# 再次檢視
mysql> show tables;
+------------------------+
| Tables_in_rsyslog      |
+------------------------+
| SystemEvents           |
| SystemEventsProperties |
+------------------------+
2 rows in set (0.00 sec)

# 兩張表都為空
mysql> select count(*) from SystemEvents;
+----------+
| count(*) |
+----------+
|        0 |
+----------+
1 row in set (0.02 sec)
#
mysql> select count(*) from SystemEventsPriperties;
ERROR 1146 (42S02): Table 'rsyslog.SystemEventsPriperties' doesn't exist
mysql> select count(*) from SystemEventsProperties;
+----------+
| count(*) |
+----------+
|        0 |
+----------+
1 row in set (0.00 sec)

# 建立一個名為 「rsysloger」 的使用者,並允許該使用者從以 「10.0.0.」 開頭的任何 IP 地址連線到 MySQL 資料庫,並設定密碼為 「123456」
mysql> create user 'rsysloger'@'10.0.0.%' identified by '123456';
Query OK, 0 rows affected (0.01 sec)

# 將 rsyslog 資料庫的所有許可權授予名為 「rsysloger」 的使用者,並允許該使用者從以 「10.0.0.」 開頭的任何 IP 地址連線 
mysql> grant all on rsyslog.* to 'rsysloger'@'10.0.0.%';
Query OK, 0 rows affected (0.00 sec)

#重新整理 MySQL 的許可權快取,以確保最新的許可權更改立即生效
mysql> flush privileges;
Query OK, 0 rows affected (0.01 sec)

# log-server 修改組態檔
[root@log-server ~]#cd /etc/rsyslog.d/
[root@log-server rsyslog.d]#ls
20-ufw.conf  21-cloudinit.conf  50-default.conf  mysql.conf
[root@log-server rsyslog.d]#vim mysql.conf
module (load="ommysql")
*.* action(type="ommysql" server="10.0.0.162" db="rsyslog" uid="rsysloger" pwd="123456")

#重啟服務
[root@log-server rsyslog.d]#systemctl restart rsyslog.service


# 測試
[14:18:56 root@client-3[ ~]#logger "this msg from client-3"
[root@client-2 ~]# logger "this msg from client-2"
[root@log-server rsyslog.d]#logger "this msg from log-server"

#  檢視資料庫
mysql> select FromHost,Message from SystemEvents order by id desc limit 3 ;
+------------+---------------------------+
| FromHost   | Message                   |
+------------+---------------------------+
| client-3   |  this msg from client-3   |
| localhost  |  this msg from client-2   |
| log-server |  this msg from log-server |
+------------+---------------------------+
3 rows in set (0.00 sec)

7 服務紀錄檔管理工具 journalctl

# 組態檔
cat /etc/systemd/journald.conf
#常用選項
--system             #顯示系統服務和核心相關紀錄檔
--user                 #顯示來自當前使用者的服務紀錄檔
-M|--machine=CONTAINER #顯示本地容器中的紀錄檔
-S|--since=DATE #顯示從指定時間之後的紀錄檔,YYYY-MM-DD 
HH:MM:SS|yesterday|today|tomorrow|now
-U|--until=DATE           #顯示從指定時間之前的紀錄檔
-c|--cursor=CURSOR #從指定 cursor 開始顯示
--after-cursor=CURSOR #從指定 cursor 之後開始顯示
--show-cursor #在最後一條紀錄檔之後顯示 cursor 值
-b|--boot[=ID] #檢視詳細啟動紀錄檔
--list-boots #列出系統啟動紀錄檔
-k|--dmesg #僅顯示核心紀錄檔,包含了 -b 及 "_TRANSPORT=kernel" 選項
-u|--unit=UNIT #根據單元檢視紀錄檔
--user-unit=UNIT #僅顯示屬於特定使用者對談單元的紀錄檔,相當於同時新增了
_SYSTEMD_USER_UNIT= _UID= 兩個條件
-p|--priority=RANGE #跟據紀錄檔等級檢視 0 emerg 1 alert 2 crit 3 err 
4 warning 5 notice 
 # 6 info 7 debug
--facility=FACILITY... #根據分類檢視
-g|--grep=PATTERN #根據正規表示式過濾
--case-sensitive[=BOOL] #模式匹配時是否區分大小寫
-e|--pager-end         #直接定位到最後
-f|--follow               #實時檢視最新紀錄檔
-n|--lines[=INTEGER]     #指定行數,從最近的紀錄檔開始算,後面不跟數位,預設10行
--no-tail             #顯示所有的行,配合 -f 使用
-r|--reverse             #反轉輸出,最新的在最上面顯示
-o|--output=STRING       #指定輸出格式,預設 short
--output-fields=LIST   #僅顯示指定欄位,在 -o 選項為
verbose/export/json/json-pretty/json-sse/json-seq 
#時有效,__CURSOR,__REALTIME_TIMESTAMP,__MONOTONIC_TIMESTAMP,_BOOT_ID
  
  
  #顯示
--utc           #使用 utc 時區顯示時間       
-x|--catalog             #在紀錄檔的輸出中增加一些解釋性的短文字,以幫助進一步說明日
志的含義,並不是所有都有
--no-full             #如果內容超長,則以省略號代替
-a|--all         #完整顯示所有欄位內容,即使其中包含不可列印字元或內容超長
      
-q|--quiet               #安靜模式,不顯示任何告警資訊
--no-pager             #不分頁,一次顯示全部
--no-hostname #不顯示來源於本機的紀錄檔訊息的主機名欄位。 此選項僅對
short 輸出格式有效
-m|--merge #混合模式包括遠端紀錄檔在內的所有可見紀錄檔
-D|--directory=PATH       #顯示來自於特定目錄中的紀錄檔,
--root=ROOT #指定紀錄檔服務的根目錄,指定後服務將以此目錄為根目錄       
    
-h|--help #顯示幫助



--version             #顯示版本資訊
-N|--fields #列出所有可用欄位               
-F|--field=FIELD     #去重顯示指定欄位    
--disk-usage           #顯示紀錄檔佔用了多少磁碟空間
--vacuum-size=BYTES   #指定紀錄檔能佔用的最大空間,K/M/G/T
--vacuum-files=INT     #指定該服務最大紀錄檔檔案數量
--vacuum-time=TIME     #用於清除指定時間之前的紀錄檔
s/m/h/days/weeks/months/years
--verify               #檢查紀錄檔檔案的內在一致性,要求紀錄檔有FSS屬性
--sync #將守戶程序中沒落盤的資料進行落盤
--flush       #將 /run/log/journal/ 中的紀錄檔資料轉儲到/var/log/journal/ 中,此操作會阻塞        
--rotate               #捲動紀錄檔檔案,此操作會阻塞
--header #顯示紀錄檔後設資料               
--list-catalog #簡略顯示紀錄檔分類資訊
--dump-catalog #詳細顯示紀錄檔分類資訊
--update-catalog #更新紀錄檔分類索引二進位制檔案        


#輸出格式說明
short #預設值,每行一條紀錄檔
short-precise #時間精確到微秒顯示
short-iso #以ISO 8601格式顯示時間
short-iso-precise #將時間戳欄位的零值從核心啟動時開始計算
short-full #與 short 內容相同,但時間顯示更詳細
short-monotonic #將時間戳欄位的零值從核心啟動時開始計算
short-unix #將時間戳欄位顯示為從"UNIX時間原點"(1970-1-1 00:00:00UTC)以來的秒數。 精確到微秒級別
verbose #以結構化的格式顯示每條紀錄檔的所有欄位
export #將紀錄檔序列化為二進位制位元組流(大部分依然是文字) 以適用於備份與網路傳輸
json #將紀錄檔項按照JSON資料結構格式化, 每條紀錄檔一行
json-pretty #將紀錄檔項按照JSON資料結構格式化, 但是每個欄位一行, 以便於人類閱讀
json-sse #將紀錄檔項按照JSON資料結構格式化,每條紀錄檔一行,但是用大括號包圍
json-seq #將紀錄檔項按照JSON資料結構格式化,每條紀錄檔前面加上ASCII記錄分隔符,後面加上ASCII換行符
cat #僅顯示紀錄檔的實際內容, 而不顯示與此紀錄檔相關的任何後設資料(包括時間戳)
with-unit #類似於 short-full,字首以unit 名來顯示,而不是syslog識別符號

檢視所有紀錄檔

# 預設顯示所有紀錄檔
root@ubuntu:~# journalctl

journalctl的檔案和其他紀錄檔檔案是分開的   syslog中的紀錄檔刪掉journalctl中還可以看到

檢視紀錄檔檔案後設資料

root@ubuntu:~# journalctl --header
File path: 
/var/log/journal/72f41ddc79b44308a161708e65544943/system@5a33791df54d481eb96a84b
38148309b-0000000000002a18-0005fb3b4880407f.journal
File ID: 86c70c45ed5d4ee48a2f6826cd2a5844
Machine ID: 72f41ddc79b44308a161708e65544943
Boot ID: dc0f2b7aa8c745c2a3ad2098d2f3eb5a
Sequential number ID: 5a33791df54d481eb96a84b38148309b
State: ARCHIVED
Compatible flags:
Incompatible flags: COMPRESSED-ZSTD KEYED-HASH
Header size: 256
Arena size: 8388352
......
......

檢視紀錄檔分類

#第一例為分類ID
root@ubuntu:~# journalctl --list-catalog
0027229ca0644181a76c4e92458afa2e systemd: One or more messages could not be forwarded to syslog
0e4284a0caca4bfc81c0bb6786972673 systemd: Unit skipped
1675d7f172174098b1108bf8c7dc8f5d systemd: DNSSEC validation failed
1b3bb94037f04bbf81028e135a12d293 systemd: Failed to generate valid unit name from path '@MOUNT_POINT@'.
1c0454c1bd2241e0ac6fefb4bc631433 systemd: systemd-udev-settle.service is deprecated.
1dee0369c7fc4736b7099b38ecb46ee7 systemd: Mount point is not empty
24d8d4452573402496068381a6312df2 systemd: A virtual machine or container has been started
3354939424b4456d9802ca8333ed424a systemd: Session @SESSION_ID@ has been terminated
36db2dfa5a9045e1bd4af5f93e1cf057 systemd: DNSSEC mode has been turned off, as server doesn't support it
39f53479d3a045ac8e11786248231fbf systemd: A start job for unit @UNIT@ has finished successfully
45f82f4aef7a4bbf942ce861d1f20990 systemd: Time zone change to @TIMEZONE@
4d4408cfd0d144859184d1e65d7c8a65 systemd: A DNSSEC trust anchor has been revoked


#顯示指定分類資訊
[root@log-server ~]# journalctl --list-catalog d9b373ed55a64feb8242e02dbe79a49c
d9b373ed55a64feb8242e02dbe79a49c systemd: Unit failed

#詳細顯示分類資訊
root@ubuntu:~# journalctl --dump-catalog
-- 0027229ca0644181a76c4e92458afa2e
Subject: One or more messages could not be forwarded to syslog
Defined-By: systemd
Support: http://www.ubuntu.com/support

One or more messages could not be forwarded to the syslog service
running side-by-side with journald. This usually indicates that the
syslog implementation has not been able to keep up with the speed of
messages queued.

#詳細顯示指定分類資訊
[root@log-server ~]# journalctl --dump-catalog d9b373ed55a64feb8242e02dbe79a49c
-- d9b373ed55a64feb8242e02dbe79a49c
Subject: Unit failed
Defined-By: systemd
Support: http://www.ubuntu.com/support
The unit @UNIT@ has entered the 'failed' state with result '@UNIT_RESULT@'.

紀錄檔跟隨,顯示最新紀錄檔

# journalctl -f

倒序顯示

# journalctl -r

檢視特定時間紀錄檔

#檢視 2023-06-30 12:0:0 到 2023-06-30 15:30:0 之間產生的紀錄檔
[root@log-server ~]# journalctl -S "2023-06-30 12:0:0" -U "2023-06-30 15:30:0"
#檢視昨天到當前的紀錄檔
[root@log-server ~]# journalctl -S yesterday
#檢視今天9點到1小時之前的紀錄檔
[root@log-server ~]# journalctl --since 09:00 --until "1 hour ago"

檢視啟動資訊

# journalctl --list-boots

#檢視本次啟動紀錄檔
[root@log-server ~]# journalctl -b 0
#檢視上次啟動紀錄檔
[root@log-server ~]# journalctl -b -1
[root@log-server ~]# journalctl -b a77f986ef80f409c8a60a0ddfd7623cd

檢視核心紀錄檔

# journalctl -k

根據服務或程式檢視

[root@log-server ~]# journalctl -u nginx.service
[root@log-server ~]# journalctl -u ssh.service
[root@log-server ~]# journalctl /usr/sbin/sshd
[root@log-server ~]# journalctl /usr/bin/bash

根據PID檢視

# journalctl _PID=1

根據UID檢視

# journalctl _UID=0

根據等級檢視

[root@log-server ~]# journalctl -p warning
[root@log-server ~]# journalctl -p 4

根據分類檢視

[root@log-server ~]# journalctl --facility=auth

指定顯示格式

[root@log-server ~]# journalctl -o json-pretty -n 1
[root@log-server ~]# journalctl -o cat -n 1

顯示特定欄位

[root@log-server ~]# journalctl -o json-pretty -n 1 --output-fields=_UID

查詢紀錄檔佔用了多少磁碟空間

[root@log-server ~]#journalctl --disk-usage
Archived and active journals take up 344.0M in the file system.

多個引數

[root@log-server ~]# journalctl -b -u nginx.service -o json-pretty

8 Logrotate 紀錄檔轉儲

Logrotate 介紹

在 Linux 系統中,能夠幫助使用者定位問題的有效手段之一就是查紀錄檔。

如果一個服務或一個程式的紀錄檔,一直只寫一個檔案,則會導致該紀錄檔檔案越來越大,無論是檢視還是 搜尋內容,備份等,都會特別不方便,而且如果伺服器數量較多,紀錄檔檔案大小增長較快,也會很容易 觸發告警。 為了解決這種情況,我們可以使用紀錄檔轉儲服務,對服務紀錄檔進行分割,按照一定的規則將紀錄檔儲存在 不同的檔案中,這樣更便於管理和歸檔。

當前伺服器上的紀錄檔轉儲

logrotate 程式是一個紀錄檔檔案管理工具。用來把舊的紀錄檔檔案刪除,並建立新的紀錄檔檔案,稱為紀錄檔轉 儲或捲動。可以根據紀錄檔檔案的大小,也可以根據其天數來轉儲,這個過程一般通過 cron 程式來執行。

相關檔案

/etc/cron.daily/logrotate   #定時任務指令碼,放在 cron.daily 目錄中,預設系統會每天執行一次
/etc/logrotate.conf         #主組態檔,定義紀錄檔轉儲策略
/etc/logrotate.d/           #組態檔目錄,定義紀錄檔轉儲策略
/usr/sbin/logrotate         #主程式
/var/lib/logrotate/status   #logrotate服務的紀錄檔檔案

工作原理:系統計劃任務每天執行一次指令碼檔案,在指令碼中再執行 /usr/sbin/logrotate /etc/logrotate.conf ,即呼叫 logrotate 程式再配合定義好的轉儲規則對紀錄檔檔案進行轉儲。

Logrotate設定

#檢視幫助
[root@log-server ~]# man logrotate.conf
# 主組態檔

[root@log-server rsyslog.d]#cat /etc/logrotate.conf
# see "man logrotate" for details

# global options do not affect preceding include directives

# rotate log files weekly
weekly     # 預設每週一次轉儲

# use the adm group by default, since this is the owning group
# of /var/log/syslog.
su root adm    # 預設是用anm組

# keep 4 weeks worth of backlogs
rotate 4    # 預設保留最近4周的檔案(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      # 預設不啟用檔案壓縮

# packages drop log rotation information into this directory
include /etc/logrotate.d     # 包含的子目錄

# system-specific logs may also be configured here.

# 每個服務單獨的組態檔,如果在單獨組態檔中沒有定義的設定項,則使用主組態檔中的設定項或預設設定
[root@log-server ~]#cat /etc/logrotate.d/rsyslog 
/var/log/syslog
/var/log/mail.info
/var/log/mail.warn
/var/log/mail.err
/var/log/mail.log
/var/log/daemon.log
/var/log/kern.log
/var/log/auth.log
/var/log/user.log
/var/log/lpr.log
/var/log/cron.log
/var/log/debug
/var/log/messages
{                    	 #上述所有紀錄檔檔案都適用於此轉儲規則
	rotate 4        	 #保留最近4個檔案,加上當前使用的,一個5個
	weekly				#每週轉儲
	missingok			#如果要轉儲的紀錄檔檔案不存在,不提示錯誤,繼續下一個
	notifempty			#如果是空檔案,不轉儲
	compress			#啟用gzip壓縮轉儲後的紀錄檔檔案
	delaycompress		#和 compress 一起使用時,轉儲的紀錄檔檔案到下一次轉儲時才壓縮
	sharedscripts 		#執行指令碼,分別是轉儲前和轉儲後指令碼
	postrotate			#轉儲後指令碼
		/usr/lib/rsyslog/rsyslog-rotate
	endscript
}




root@jose-404:~# cat /etc/logrotate.d/nginx 
/var/log/nginx/*.log {
 daily
 missingok
 rotate 14
 compress
 delaycompress
 notifempty
 create 0640 www-data adm
 sharedscripts
 prerotate
 if [ -d /etc/logrotate.d/httpd-prerotate ]; then \
 run-parts /etc/logrotate.d/httpd-prerotate; \
 fi \
 endscript
 postrotate
 invoke-rc.d nginx rotate >/dev/null 2>&1       # 讓nginx 重新錨定新生成的紀錄檔檔案(強刷)
 endscript
}

常用設定項

compress 			#通過gzip壓縮轉儲以後的紀錄檔
nocompress 			#不壓縮
copytruncate 		#用於還在開啟中的紀錄檔檔案,把當前紀錄檔備份並截斷
nocopytruncate 		#用於還在開啟中的紀錄檔檔案,把當前紀錄檔備份並截斷
create mode owner group 		#轉儲檔案,使用指定的許可權,所有者,所屬組建立新的紀錄檔檔案
nocreate 			#不建立新的紀錄檔檔案
su user group 					#指定轉儲的使用者和組,如果紀錄檔檔案的父目錄屬組或other 具有寫許可權,則要指定此處
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腳
nosharedscripts 		#針對每一個轉儲的紀錄檔檔案,都執行一次prerotate 和postrotate指令碼,此為預設值
missingok 		#如果紀錄檔不存在,不提示錯誤,繼續處理下一個
nomissingok 		#如果紀錄檔不存在,提示錯誤,此為預設值

Logrotate 自定義規則實現

logrotate 命令

# 建立測試檔案
[root@log-server ~]#dd if=/dev/zero of=/var/log/test1.log bs=2M count=1
1+0 records in
1+0 records out
2097152 bytes (2.1 MB, 2.0 MiB) copied, 0.00582667 s, 360 MB/s


# 定義轉儲規則
[root@log-server ~]#vim /etc/logrotate.d/test1
[root@log-server ~]#cat /etc/logrotate.d/test1
/var/log/test1.log {
 daily
#每天轉儲一次
 rotate 5
#保留5個
  su root root
#屬主屬組是root 
compress
#壓縮
 delaycompress
#轉儲的紀錄檔檔案到下一次轉儲時才壓縮
 missingok
#如果紀錄檔不存在,不提示錯誤,繼續處理下一個
 size 1M
#超過1兆就壓縮
 notifempty
#如果是空檔案的話,不轉儲
 create 0640 syslog adm
#許可權是640 屬主屬組是syslog adm
 postrotate
#轉儲之後寫一句話到下面的檔案中
     echo `date +%F_%T` >> /tmp/test1-rs.log
 endscript
}

# 手動執行轉儲
[root@log-server ~]#logrotate /etc/logrotate.d/test1

# 檢視紀錄檔,生成新的空檔案,許可權,屬主屬組符合預設
[root@log-server ~]#ls -lh /var/log/test1*
-rw-r----- 1 syslog adm     0 Jul 20 18:19 /var/log/test1.log    # 檔案為空 自動跳過不轉儲
-rw-r--r-- 1 root   root 2.0M Jul 20 18:08 /var/log/test1.log.1

#再次新增測試檔案
[root@log-server ~]#dd if=/dev/zero of=/var/log/test1.log bs=3M count=1
1+0 records in
1+0 records out
3145728 bytes (3.1 MB, 3.0 MiB) copied, 0.00946369 s, 332 MB/s

# 再次轉儲  新增檔案後再次手動轉儲
[root@log-server ~]#logrotate /etc/logrotate.d/test1
[root@log-server ~]#ls -lh /var/log/test1*
-rw-r----- 1 syslog adm     0 Jul 20 18:20 /var/log/test1.log
-rw-r----- 1 syslog adm  3.0M Jul 20 18:20 /var/log/test1.log.1    # 最新的轉儲
-rw-r--r-- 1 root   root 2.1K Jul 20 18:08 /var/log/test1.log.2.gz   # 前一個被轉儲的紀錄檔被壓縮