rsyslog 介紹 日誌(Log)是記錄和存儲電腦、軟體、應用或其他系統的操作和事件的文件或數據流。它們可以為系統管理員、開發人員和最終用戶提供詳細的背景信息,以幫助他們瞭解和診斷系統的行為。 rsyslog 是一個開源的日誌處理工具,一般用在類Unix系統上,是syslogd 的擴展。它提供了 ...
rsyslog 介紹
日誌(Log)是記錄和存儲電腦、軟體、應用或其他系統的操作和事件的文件或數據流。它們可以為系統管理員、開發人員和最終用戶提供詳細的背景信息,以幫助他們瞭解和診斷系統的行為。
rsyslog 是一個開源的日誌處理工具,一般用在類Unix系統上,是syslogd 的擴展。它提供了更好的性能和更多的功能,因此在許多現代 Linux 發行版中,已經成為預設的日誌管理服務。
rsyslog 本地日誌管理
rsyslog作為預設的系統日誌管理服務,預設會在/var/log目錄下生成一些日誌文件,這些文件都是通過rsyslog配置文件(/etc/rsyslog.conf)定義,在主配置文件中通過 $IncludeConfig
指令引入 /etc/rsyslog.d/ 下以 .conf 結尾的配置,載入主配置文件的時候,這些子配置文件也會一同被讀取和應用。
例如: 這是ubuntu2004這個發行版系統中,rsyslog的預設配置示例,定義了哪些消息應當被寫入哪些日誌文件。
auth,authpriv.* /var/log/auth.log
表示對於 auth 和 authpriv 這兩個日誌類別的所有優先順序(由 .* 表示)的消息,都寫入 /var/log/auth.log 文件。
rsyslog 配置文件
總體來說,rsyslog 配置文件由三部分組成,模塊配置、全局配置、日誌規則。
1、模塊配置:
因為rsyslog時基於模塊設計的,載入不同的模塊,需要通過載入不同的模塊來支持各種不同的輸入、輸出、消息格式和協議
$ModLoad modulename
2、全局配置:
會影響rsyslog的整體行為。例如,定義預設的日誌文件目錄、設置隊列大小、指定工作線程數等。
3、日誌規則:
定義了日誌消息如何被處理。每個規則通常由兩部分組成:選擇器(決定哪些消息被選中)和動作(決定對這些消息做什麼)
日誌規則格式
定義本地的一些日誌文件,只需要添加對應的日誌規則就行了,不用修改模塊和全局配置
選擇器 動作
選擇器:
用於確定哪些日誌消息被選中。選擇器又由兩部分組成:設施和優先順序。格式: 設施.優先順序
設施: 定義日誌的來源,有以下幾種常見的設施:
-
auth: 認證相關的消息
-
kern: 內核消息
-
mail: 郵件系統
-
daemon: 系統守護進程
-
user: 用戶級消息
-
*:表示所有設置
優先順序; 表示消息的重要性級別,有幾種常見的級別:
-
emerg: 最高的日誌級別,表示系統遇到了災難性的問題
-
alert: 通常是非常嚴重的問題。
-
crit: 表示嚴重的錯誤或問題,可能會導致系統或應用的部分功能中斷。
-
err或error: 表示發生了錯誤,但系統或應用仍然在正常運行
-
warn或warning: 表示可能的問題,可能會導致錯誤,但還沒有達到錯誤狀態。
-
notice: 不表示錯誤或問題,但是值得註意
-
info: 在正常操作中生成,但它們不指示問題。
-
debug: 用於調試目的的消息。這是最詳細的日誌級別
-
none:明確表示不選擇任何優先順序
-
*:表示匹配所有優先順序
動作:
動作決定對所選消息做什麼。常見的動作有:
-
寫入本地文件,例如:/var/log/mail.log
-
發送到遠程伺服器,例如:@192.168.1.1
-
發送電子郵件,資料庫寫入等,取決於載入的rsyslog模塊
例如:
*.*;auth,authpriv.none -/var/log/syslog
這條規則定義了三個子選擇器,共同形成了一個複合選擇器。
-
.: 選擇所有設施的所有優先順序的消息
-
auth.none: 排除來自 auth 設施的所有消息
-
authpriv.none: 排除來自 authpriv 設施的所有消息
在 rsyslog 的選擇器語法中,可以通過 逗號, 來分隔不同的設施,這樣可以在單個選擇器內同時指定多個設施。 因此,auth,authpriv.none 實際上是兩個選擇器,但它們都有相同的優先順序 .none。
所以 .;auth,authpriv.none 效果等同於 .;auth.none;authpriv.none
-/var/log/syslog 表示消息應該被寫入的文件路徑, -: 是一個首碼,告訴rsyslog將日誌條目先寫入操作系統的緩衝區,而不是立即同步到硬碟。操作系統會在適當的時機(基於其內部邏輯和策略)將這些緩衝區中的數據刷新到硬碟。
所以由此可知,在rsyslog的規則語法中:
-
使用分號 ; 來分隔不同的子選擇器。
-
使用逗號 , 來分隔具有相同優先順序的不同設施,使表示更為緊湊。
-
動作是一個文件路徑時,前面加上 - 首碼,表示非同步寫入硬體
例如:
auth,authpriv.* /var/log/auth.log
根據上面我們知道規則中使用逗號是用來隔離具有相同優先順序的不同設施,所以這裡表示將auth和authpriv的所有優先順序消息寫入/var/log/auth.log
rsyslog 自定義設施
在rsyslog中,自定義了8個設置。loca0到local8,應用程式和用戶可以自定義這些設施時用來做啥的。
例如:
公司開發了一個名為"MyApp"的應用程式,他們可以選擇使用local0作為"MyApp"的日誌設施。然後,在rsyslog配置中,可以專門為local0指定日誌處理規則,如將"MyApp"的日誌消息寫入一個特定的日誌文件
例如: 自定義ssh的日誌存放位置:(sshd服務支持rsyslog,調用了rsyslog的介面,所以我們可以修改)
(1)查看sshd的日誌存放位置,預設sshd使用AUTH設施來發送它的日誌消息,且日誌信息的優先順序是 info。
(2)修改sshd的配置文件
# 指示sshd將其日誌消息發送到local7設施。
vim /etc/ssh/sshd_config
SyslogFacility local7
(3)修改rsyslog配置文件,定義local7這種級別的日誌處理方式
# 指示rsyslog將所有local7設施的消息寫入/var/log/sshd.log文件
vim /etc/rsyslog.d/50-default.conf
local7.* -/var/log/sshd.log
(4)重啟sshd服務和rsyslog服務
sudo systemctl restart sshd.service
sudo systemctl restart rsyslog.service
(5)測試是否成功
可以用logger命令來進行測試:
logger -p local7.info "hello sshd"
logger工具說明
logger 是一個用於向系統日誌發送消息的命令行工具。
格式:
# 不指定任何設施和優先順序參數,它預設向user.notice發送消息。
logger " this is a log "
# 指定設施,沒指定優先順序,預設優先順序是notice
logger -p local7.info "hello sshd"
說明:
logger 預設情況下是向系統日誌發送一條信息,也可以使用-p參數來指定日誌的設施和優先順序,但是如果就指定了設施,沒有指定優先順序的話,預設使用的是notice。編寫shell腳本的時候,可以直接用logger工具來將指定的日誌信息寫入日誌文件中。
rsyslog 網路日誌管理
可以將將多個遠程主機的日誌集中發送到一臺日誌伺服器上存儲,方便後期的管理。
例如:
docker場景中,可以將多個docker容器的日誌發送到一個專門的日誌容器中,再將這個容器中存儲日誌的位置映射到宿主機上,這樣就實現了容器日誌的統一管理。
服務端配置
服務端需要啟動相應的輸入模塊來來監聽指定的埠並接收日誌消息。有兩個模塊可以實現這個功能;
imudp.so模塊:提供udp連接
imptcp.so模塊:提供tcp連接
載入模塊方法:
vim /etc/rsyslog.conf
# 載入udp模塊
module(load="imudp") # needs to be done just once
input(type="imudp" port="514") #表示打開udp的514埠
# 載入tcp模塊
module(load="imtcp") # needs to be done just once
input(type="imtcp" port="514") #表示打開tcp的514埠
客戶端配置
服務端開啟指定的埠後,客戶端只需要編寫對應的規則,將指定的日誌消息發送給服務端就行了。
選擇器 @server_iphost:port 或 選擇器 @@server_iphost:port
說明:
指定遠程伺服器地址的時候,如果使用一個@符號,表示使用的是udp協議發送日誌信息到日誌伺服器,如果使用兩個@符號,表示使用的是TCP協議發送日誌信息到日誌伺服器
例如:
*.info;mail.none;authpriv.none;cron.none @10.0.0.11:514
測試驗證:
可以通過在客戶端使用logger工具來將執行信息寫入到日誌中,然後再去服務端查看。如果有對應的信息就說明成功了。
說明:
還可以通過gtls模塊來配置數據傳輸過程的加密,需要結合證書使用,如果日誌存在敏感數據以及日誌需要跨互聯網或其他公共網路發送,使用加密可以增加安全性,防止數據被截獲或篡改。
journalctl 介紹
journalctl是systemd提供的一個命令行工具,用於查詢和顯示由 systemd-journald 服務收集和管理的日誌信息。
systemd-journald 是 systemd 初始化系統的組成部分,負責收集和存儲系統日誌,不僅包括系統服務的日誌,還包括內核、應用程式和其他系統組件的日誌。
journalctl 使用說明
直接輸入journalctl命令,就會顯示系統上所有的日誌信息:
journalctl
查看系統全部日誌太多了不好查看,可以用 --since "開始時間" --until "結束時間" 來查看指定時間段的所有日誌
journalctl --since "2023-10-1" --util "2023-10-8"
如果想要實時查看所有日誌中最後幾行日誌,可以使用 -f 參數類似於tail命令的-f選項
journalctl -f
要查看指定service的日誌話,通過 -u選項,然後指定service命令就行了
journalctl -u service_name
還可以查看指定進程的日誌,需要使用 _PID=PID_num 指定進程的編號即可,同理查看指定用戶的日誌用 _UID=UID_NUM 即可。
journalctl _PID=1234
查看內核日誌用 -k 選項, 查看啟動日誌用 -b 選項
journalctl -k
journalctl -b
logrotate 介紹
存在這麼一種情況,隨著Linux系統的長時間運行,系統上的日誌文件會越來越大,最終結果就是將存儲空間全部占滿,為了確保它們不會無限制地增長,所以有了logrotate。
簡單來說,logrotate 的主要目的是防止日誌文件無限制地增長並消耗所有的磁碟空間,並且根據定義的規則定期輪換、壓縮和管理舊日誌文件,確保只保留有價值和必要的日誌記錄。
logrotate 配置文件
和rsyslog一樣,logrotate也有主配置文件(/etc/logrotate.conf)和子配置文件(預設/etc/logrotate.d目錄下),主配置文件通過include指令指定子配置文件的存放位置。
通過編寫指定日誌的配置文件,就可以實現對指定日誌文件大小的管理了。一般都是在/etc/logrotate.d下編輯,命名方式以日誌文件名稱命名,這個方便後期管理。
規格文件的格式大致是這樣的:
被管理的日誌文件的路徑
{
# 具體該如何處理這個日誌文件
}
例如:系統上rsyslog這個日誌文件的管理規則是這樣的:
# 指定瞭如何處理 /var/log/syslog 這個日誌文件
/var/log/syslog # 被管理的日誌文件的路徑
{
rotate 7 # 保留7個舊的日誌文件
daily # 每天輪換日誌文件
missingok # 如果日誌文件丟失,不要發出錯誤消息
notifempty # 如果日誌文件為空,不進行輪換
delaycompress # 在下次輪換時才壓縮上一次的舊日誌
compress # 壓縮舊的日誌文件,通常使用gzip進行壓縮,所以會看到 .gz 的尾碼。
# 在日誌文件輪換之後,執行指定的命令或腳本,腳本位於postrotate和endscript中間
postrotate
/usr/lib/rsyslog/rsyslog-rotate
endscript
}
例如:讓/var/log/nginx目錄下的日誌保存半年
/var/log/nginx/*.log
{
monthly # 每月輪換一次。
rotate 6 # 保存6個舊日誌文件,也就是前六個月的日誌文件都保存
compress # 舊日誌文件採用gzip演算法壓縮
delaycompress # 在下次輪換時才壓縮上一次的舊日誌
missingok
notifempty # 如果日誌文件為空,則不進行輪換。
create 0640 nginx adm # 使用指定的許可權重新創建日誌文件,並指定其屬主和組。
sharedscripts # 如果/var/log/nginx/下有多個日誌文件,預設會針對每個單獨的日誌文件執行。通過指定sharedscripts 不論多少日誌文件涉及到輪換,這些腳本只會執行一次。
postrotate # 日誌文件輪換後要執行的命令,發送一個信號給nginx,通知它日誌文件已經被輪換,它應該開始寫新的日誌文件。
if [ -f /var/run/nginx.pid ]; then
kill -USR1 `cat /var/run/nginx.pid`
fi
endscript
}
logrotate 轉換選項
轉換時間:
-
daily 每天一次
-
weekly 每周一次
-
monthly 每月一次
轉換大小:
- size 當日誌文件到達指定的大小時才轉儲,預設值位元組,例如:size 200MB
保留舊日誌數量:
- rotate 指定保留舊日誌的數量,例如:rotate 7表示保留7個舊的日誌文件(加上當前的日誌文件,將最多有8個日誌文件:當前的和7個舊的)。
壓縮選項:
-
compress 使用gzip演算法將舊日誌進行壓縮,文件名預設以gz結尾
-
nocompress 不對舊日誌進行壓縮
-
delaycompress 在下次輪換時才壓縮上一次的舊日誌
其它規則:
-
missingok 如果日誌不存在,不提示錯誤,繼續處理下一個
-
notifempty 如果日誌文件為空,不進行輪換
-
ifempty 即使是空文件也轉儲,此為預設選項
-
postrotate xxxx endscript 在日誌文件輪換之後,執行指定的命令或腳本
-
sharedscripts 指定的位置下麵有多個日誌文件,只執行postrotate xxxx endscript中的腳本一次,也不是一個日誌文件就要執行一次。
-
olddir 轉儲後的日誌文件放入指定目錄,必須和當前日誌文件在同一個文件系統。預設是存放在和當前日誌所在的目錄中
-
noolddir 轉儲後的日誌文件和當前日誌文件放在同一個目錄下,預設就是這個選項。
logrotate 預設配置
我們在查看logrotate.conf配置文件的時候也可以看到有如下的預設規則:
這些配置都是logrotate 的全局或預設配置。它定義了一些預設的設置,但這部分配置本身並不直接管理任何特定的日誌文件。它為後續在 logrotate 配置中定義的日誌文件或在 /etc/logrotate.d/ 目錄下的配置文件提供了預設值。
logrotate 工作原理
在以前的一些版本中,logrotate 的配置預設是通過cron.daily目錄中的腳本來運行的。如果你查看 /etc/cron.daily 目錄,你可能會發現一個名為logrotate的腳本,這個腳本通常會調用logrotate命令,並使用 /etc/logrotate.conf 作為其配置文件。
但是現在,大多數Linux發行版給它加了個service文件,通過systemd來管理logrotate
logrotate.service 文件定義瞭如何運行 logrotate
說明:
-
Loaded: 表示這個服務已被載入。這裡的“static”意味著這個服務不能被直接啟動,但可以被其他單位(如一個timer)所觸發。
-
TriggeredBy: 顯示哪個單位(如timer)會觸發此服務。
說明: 是通過調用logrotate命令,並使用/etc/logrotate.conf作為其配置文件實現的service服務。
logrotate.timer 文件定義了何時運行 logrotate.service。
說明:
-
Trigger: 顯示下一次logrotate會被觸發的時間。
-
Triggers: 這個timer會觸發的服務。在此例中,它會觸發logrotate.service,這是執行實際的日誌輪換的服務。