Linux 日誌管理

来源:https://www.cnblogs.com/heyongshen/archive/2023/11/06/17810127.html
-Advertisement-
Play Games

rsyslog 介紹 日誌(Log)是記錄和存儲電腦、軟體、應用或其他系統的操作和事件的文件或數據流。它們可以為系統管理員、開發人員和最終用戶提供詳細的背景信息,以幫助他們瞭解和診斷系統的行為。 rsyslog 是一個開源的日誌處理工具,一般用在類Unix系統上,是syslogd 的擴展。它提供了 ...


rsyslog 介紹

日誌(Log)是記錄和存儲電腦、軟體、應用或其他系統的操作和事件的文件或數據流。它們可以為系統管理員、開發人員和最終用戶提供詳細的背景信息,以幫助他們瞭解和診斷系統的行為。

rsyslog 是一個開源的日誌處理工具,一般用在類Unix系統上,是syslogd 的擴展。它提供了更好的性能和更多的功能,因此在許多現代 Linux 發行版中,已經成為預設的日誌管理服務。

官網地址:https://www.rsyslog.com/

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,這是執行實際的日誌輪換的服務。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 推薦一個分散式圖資料庫Nebula Graph,萬億級數據,毫秒級延時 什麼是Nebula Graph Nebula Graph 是一款開源的、分散式的、易擴展的原生圖資料庫,能夠承載包含數千億個點和數萬億條邊的超大規模數據集,並且提供毫秒級查詢 什麼是圖資料庫 圖資料庫是專門存儲龐大的圖形網路並從 ...
  • 高精度的本質是將數字以字元串的形式讀入,然後將每一位分別存放入`int`數組中,通過模擬每一位的運算過程,來實現最終的運算效果。 ...
  • 對於手工計算來說,積分計算是非常困難的,對於一些簡單的函數,我們可以直接通過已知的積分公式來求解,但在更多的情況下,原函數並沒有簡單的表達式,因此確定積分的反函數變得非常困難。 另外,相對於微分運算來說,積分運算則具有更多的多樣性,包括不同的積分方法(如換元積分法、分部積分法等)和積分技巧,需要根據 ...
  • 一、概念 AOP面向切麵編程,一種編程範式 二、作用 在不改動原始設計(原代碼不改動)的基礎上為方法進行功能增強(即增加功能) 三、核心概念 1、代理(Proxy):SpringAOP的核心本質是採用代理模式實現的 2、連接點(JoinPoint):在SpringAOP中,理解為任意方法的執行 3、 ...
  • Go 方法集合與選擇receiver類型 目錄Go 方法集合與選擇receiver類型一、receiver 參數類型對 Go 方法的影響二、選擇 receiver 參數類型原則2.1 選擇 receiver 參數類型的第一個原則2.2 選擇 receiver 參數類型的第二個原則三、方法集合(Met ...
  • 線程池(重點) 線程池:三大方法、七大參數、四種拒絕策略 池化技術 程式的運行,本質:占用系統的資源!優化資源的使用!-> 池化技術(線程池、連接池、對象池......);創建和銷毀十分消耗資源 池化技術:事先準備好一些資源,有人要用就拿,拿完用完還給我。 線程池的好處: 1、降低資源消耗 2、提高 ...
  • 我們在類中通常會有一個屬性為 IsDel來表示軟刪除或也稱邏輯刪除,這個屬性會導致我們在進行查詢操作時,每一次都要 .where(s=>s.IsDel==false) 非常的麻煩。在使用efCore時可以通過配置查詢篩選器來很好的解決這個問題。 public class SysUser { publ ...
  • 搜索查找指令 find 指令 find指令將從指定目錄向下遞歸的遍歷其各個子目錄,將滿足條件的文件或者目錄顯示在終端。 基本語法 find [搜索範圍(指定目錄)] [選項] 選項說明 選項 功能 -name<查詢方式> 按照指定的文件名查找模式查找文件 -user<用戶名> 查找屬於指定用戶名所有 ...
一周排行
    -Advertisement-
    Play Games
  • 前言 推薦一款基於.NET 8、WPF、Prism.DryIoc、MVVM設計模式、Blazor以及MySQL資料庫構建的企業級工作流系統的WPF客戶端框架-AIStudio.Wpf.AClient 6.0。 項目介紹 框架採用了 Prism 框架來實現 MVVM 模式,不僅簡化了 MVVM 的典型 ...
  • 先看一下效果吧: 我們直接通過改造一下原版的TreeView來實現上面這個效果 我們先創建一個普通的TreeView 代碼很簡單: <TreeView> <TreeViewItem Header="人事部"/> <TreeViewItem Header="技術部"> <TreeViewItem He ...
  • 1. 生成式 AI 簡介 https://imp.i384100.net/LXYmq3 2. Python 語言 https://imp.i384100.net/5gmXXo 3. 統計和 R https://youtu.be/ANMuuq502rE?si=hw9GT6JVzMhRvBbF 4. 數 ...
  • 本文為大家介紹下.NET解壓/壓縮zip文件。雖然解壓縮不是啥核心技術,但壓縮性能以及進度處理還是需要關註下,針對使用較多的zip開源組件驗證,給大家提供個技術選型參考 之前在《.NET WebSocket高併發通信阻塞問題 - 唐宋元明清2188 - 博客園 (cnblogs.com)》講過,團隊 ...
  • 之前寫過兩篇關於Roslyn源生成器生成源代碼的用例,今天使用Roslyn的代碼修複器CodeFixProvider實現一個cs文件頭部註釋的功能, 代碼修複器會同時涉及到CodeFixProvider和DiagnosticAnalyzer, 實現FileHeaderAnalyzer 首先我們知道修 ...
  • 在軟體行業,經常會聽到一句話“文不如表,表不如圖”說明瞭圖形在軟體應用中的重要性。同樣在WPF開發中,為了程式美觀或者業務需要,經常會用到各種個樣的圖形。今天以一些簡單的小例子,簡述WPF開發中幾何圖形(Geometry)相關內容,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 在 C# 中使用 RabbitMQ 通過簡訊發送重置後的密碼到用戶的手機號上,你可以按照以下步驟進行 1.安裝 RabbitMQ 客戶端庫 首先,確保你已經安裝了 RabbitMQ 客戶端庫。你可以通過 NuGet 包管理器來安裝: dotnet add package RabbitMQ.Clien ...
  • 1.下載 Protocol Buffers 編譯器(protoc) 前往 Protocol Buffers GitHub Releases 頁面。在 "Assets" 下找到適合您系統的壓縮文件,通常為 protoc-{version}-win32.zip 或 protoc-{version}-wi ...
  • 簡介 在現代微服務架構中,服務發現(Service Discovery)是一項關鍵功能。它允許微服務動態地找到彼此,而無需依賴硬編碼的地址。以前如果你搜 .NET Service Discovery,大概率會搜到一大堆 Eureka,Consul 等的文章。現在微軟為我們帶來了一個官方的包:Micr ...
  • ZY樹洞 前言 ZY樹洞是一個基於.NET Core開發的簡單的評論系統,主要用於大家分享自己心中的感悟、經驗、心得、想法等。 好了,不賣關子了,這個項目其實是上班無聊的時候寫的,為什麼要寫這個項目呢?因為我單純的想吐槽一下工作中的不滿而已。 項目介紹 項目很簡單,主要功能就是提供一個簡單的評論系統 ...