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 MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...