跳轉到內容

Linux 日誌管理與分析實戰 | rsyslog journald 日誌排查教程

Linux 日誌管理與分析

日誌是 Linux 系統的"黑匣子",記錄著系統運行的每一個細節。掌握日誌管理與分析技能,是快速定位故障、排查問題的關鍵。本文將系統講解 Linux 日誌體系、rsyslog 配置、journald 使用、日誌輪轉及高效分析技巧。


一、Linux 日誌體系概覽

1.1 常見日誌文件

Linux 系統的日誌主要存儲在 /var/log/ 目錄下:

日誌文件說明
/var/log/syslog系統主日誌(Debian/Ubuntu)
/var/log/messages系統主日誌(CentOS/RHEL)
/var/log/auth.log認證日誌(SSH、登錄等)
/var/log/secure安全日誌(CentOS/RHEL)
/var/log/kern.log內核日誌
/var/log/dmesg內核啟動日誌
/var/log/daemon.log守護進程日誌
/var/log/cron定時任務日誌
/var/log/nginx/Nginx 訪問/錯誤日誌
/var/log/apache2/Apache 日誌
/var/log/mysql/MySQL 日誌

1.2 日誌級別(Severity)

級別數值說明
emerg0緊急,系統不可用
alert1警報,需立即處理
crit2嚴重錯誤
err3錯誤
warning4警告
notice5通知(正常但重要)
info6信息
debug7調試信息

1.3 日誌設施(Facility)

設施說明
kern內核消息
user用戶級消息
mail郵件系統
daemon系統守護進程
auth認證/安全
syslogsyslog 內部消息
lpr打印系統
news新聞組
uucpUUCP 系統
cron定時任務
local0~local7本地自定義(共 8 個)

二、rsyslog 配置詳解

2.1 配置文件結構

rsyslog 的主配置文件:

  • /etc/rsyslog.conf — 主配置
  • /etc/rsyslog.d/*.conf — 子配置目錄(推薦)

基本語法:

設施.級別        動作

示例:

bash
# auth 相關的所有日誌寫到 auth.log
auth.*                          /var/log/auth.log

# 所有 info 級別以上(除了 mail、auth、cron)寫到 syslog
*.info;mail.none;auth.none;cron.none    /var/log/syslog

# 內核所有日誌寫到 kern.log
kern.*                          /var/log/kern.log

# 緊急級別消息發給所有在線用戶
*.emerg                         :omusrmsg:*

# 遠程日誌發送到日誌服務器
*.*                             @192.168.1.100:514    # UDP
*.*                             @@192.168.1.100:514   # TCP

2.2 自定義日誌規則

為應用程序配置獨立的日誌文件:

bash
# /etc/rsyslog.d/myapp.conf
# 將 local0 設施的日誌寫入 myapp.log
local0.*                        /var/log/myapp.log

# 僅記錄 warning 及以上級別
local0.warning                  /var/log/myapp-error.log

# 同一規則多個動作(寫文件 + 發遠程)
local0.*                        /var/log/myapp.log
local0.*                        @@log.example.com:514

重啟 rsyslog 生效:

bash
systemctl restart rsyslog
systemctl status rsyslog

2.3 接收遠程日誌(服務端配置)

bash
# /etc/rsyslog.conf 中啟用 UDP 接收
module(load="imudp")
input(type="imudp" port="514")

# 啟用 TCP 接收
module(load="imtcp")
input(type="imtcp" port="514")

# 按來源 IP 分開存儲日誌
:fromhost-ip, isequal, "192.168.1.50" /var/log/remote/server1.log
& stop

記得防火牆開放 514 端口:

bash
iptables -A INPUT -p udp --dport 514 -s 192.168.1.0/24 -j ACCEPT
iptables -A INPUT -p tcp --dport 514 -s 192.168.1.0/24 -j ACCEPT

三、systemd journald 使用

3.1 journalctl 基本命令

bash
# 查看所有日誌
journalctl

# 查看內核日誌(類似 dmesg)
journalctl -k

# 查看指定服務的日誌
journalctl -u nginx.service
journalctl -u sshd

# 實時跟蹤日誌(類似 tail -f)
journalctl -f
journalctl -u nginx -f

# 查看最近 N 行
journalctl -n 50
journalctl -u nginx -n 100

# 按時間範圍過濾
journalctl --since "2026-06-24 09:00:00"
journalctl --since "1 hour ago"
journalctl --since "yesterday" --until "today"
journalctl --since "2026-06-01" --until "2026-06-07"

3.2 高級過濾

bash
# 按級別過濾(err 及以上)
journalctl -p err
journalctl -p warning..err

# 按優先級顯示(0=emerg 到 7=debug)
journalctl -p 3 -x

# 按進程 ID
journalctl _PID=1234

# 按用戶 ID
journalctl _UID=1000

# 按可執行文件路徑
journalctl /usr/bin/nginx

# 只顯示本次啟動後的日誌
journalctl -b
journalctl -b -1  # 上一次啟動
journalctl --list-boots  # 列出所有啟動記錄

# 輸出格式
journalctl -o json        # JSON 格式
journalctl -o verbose     # 詳細格式
journalctl -o short-iso   # ISO 時間格式

3.3 journald 配置

配置文件:/etc/systemd/journald.conf

ini
[Journal]
# 存儲位置:auto(默認,優先持久化)、persistent(持久化)、volatile(僅內存)、none(不記錄)
Storage=persistent

# 日誌佔用磁盤空間限制
SystemMaxUse=1G
SystemKeepFree=500M
SystemMaxFileSize=100M

# 日誌保留時間
MaxRetentionSec=1month

# 單條消息最大大小
LineMax=48K

啟用持久化日誌:

bash
mkdir -p /var/log/journal
systemd-tmpfiles --create --prefix /var/log/journal
systemctl restart systemd-journald

四、日誌輪轉(logrotate)

4.1 為什麼需要日誌輪轉

日誌文件會不斷增長,佔用磁盤空間。logrotate 自動實現:

  • 按週期(日/周/月)切割日誌
  • 壓縮舊日誌
  • 刪除過期日誌
  • 發送郵件通知

4.2 配置文件

主配置:/etc/logrotate.conf 自定義配置:/etc/logrotate.d/ 目錄

Nginx 日誌輪轉示例:

bash
# /etc/logrotate.d/nginx
/var/log/nginx/*.log {
    daily               # 每天輪轉
    missingok           # 日誌不存在不報錯
    rotate 30           # 保留 30 份
    compress            # 壓縮舊日誌
    delaycompress       # 延遲壓縮(下一次輪轉時再壓縮)
    notifempty          # 空日誌不輪轉
    create 0640 www-data adm  # 新日誌權限
    sharedscripts       # 所有日誌輪轉完後只執行一次腳本
    postrotate          # 輪轉後執行的命令
        if [ -f /run/nginx.pid ]; then
            kill -USR1 `cat /run/nginx.pid`
        fi
    endscript
}

4.3 常用配置參數

參數說明
daily/weekly/monthly輪轉週期
rotate N保留 N 份舊日誌
compress啟用 gzip 壓縮
delaycompress延遲一次再壓縮
missingok日誌不存在不報錯
notifempty空文件不輪轉
size 100M達到指定大小就輪轉
maxage 30刪除 30 天前的日誌
create 模式 用戶 組新日誌文件屬性
dateext日誌文件名加日期後綴
postrotate/endscript輪轉後執行腳本
prerotate/endscript輪轉前執行腳本

4.4 手動測試

bash
# 調試模式(不實際執行)
logrotate -d /etc/logrotate.d/nginx

# 強制執行(即使不到時間)
logrotate -f /etc/logrotate.d/nginx

# 查看 logrotate 定時任務
cat /etc/cron.daily/logrotate

五、日誌分析常用命令

5.1 grep 系列

bash
# 搜索包含關鍵詞的行
grep "error" /var/log/syslog
grep "Failed password" /var/log/auth.log

# 忽略大小寫
grep -i "error" /var/log/nginx/error.log

# 顯示行號
grep -n "error" /var/log/syslog

# 統計匹配行數
grep -c "error" /var/log/syslog

# 反向匹配(不包含關鍵詞)
grep -v "debug" /var/log/syslog

# 同時匹配多個關鍵詞(或)
grep -E "error|warning" /var/log/syslog

# 同時匹配多個關鍵詞(與)
grep "error" /var/log/syslog | grep "nginx"

# 顯示匹配行前後上下文
grep -C 3 "error" /var/log/syslog   # 前後各 3 行
grep -B 2 "error" /var/log/syslog   # 之前 2 行
grep -A 5 "error" /var/log/syslog   # 之後 5 行

# 遞歸搜索目錄
grep -r "error" /var/log/
grep -rn "error" /var/log/nginx/

5.2 tail / head

bash
# 實時跟蹤日誌
tail -f /var/log/nginx/access.log
tail -F /var/log/syslog   # 日誌輪轉後自動跟蹤新文件

# 顯示最後 N 行
tail -n 100 /var/log/syslog

# 從第 N 行開始顯示
tail -n +100 /var/log/syslog

# 顯示前 N 行
head -n 50 /var/log/syslog

5.3 awk 高級分析

bash
# 提取某一列(空格分隔)
awk '{print $1, $5, $9}' /var/log/nginx/access.log

# 按狀態碼統計訪問次數
awk '{print $9}' /var/log/nginx/access.log | sort | uniq -c | sort -rn

# 統計訪問量 Top 10 IP
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -10

# 統計訪問量前 10 的 URL
awk '{print $7}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -10

# 按時間段統計(按小時)
awk '{print substr($4, 2, 14)}' /var/log/nginx/access.log | sort | uniq -c

# 統計 5xx 錯誤的 IP
awk '$9 ~ /^5/ {print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -rn

# 統計響應時間大於 1 秒的請求
awk '$(NF-1) > 1.0 {print $0}' /var/log/nginx/access.log | head -20

5.4 其他實用命令

bash
# 去重統計
sort access.log | uniq -c | sort -rn

# wc 統計行數/字數/字節數
wc -l /var/log/syslog
wc -c /var/log/syslog

# cut 按分隔符截取
cut -d' ' -f1,7 /var/log/nginx/access.log

# sed 替換/提取
sed -n '100,200p' /var/log/syslog   # 查看 100-200 行
sed '/error/d' /var/log/syslog      # 刪除包含 error 的行

# zcat 查看壓縮日誌
zcat /var/log/syslog.2.gz | grep "error"
zless /var/log/syslog.2.gz

六、實戰:常見故障日誌排查

6.1 SSH 登錄失敗排查

bash
# 查看所有登錄失敗記錄
grep "Failed password" /var/log/auth.log

# 查看被暴力破解的 Top IP
grep "Failed password" /var/log/auth.log | awk '{print $(NF-3)}' | sort | uniq -c | sort -rn | head -20

# 查看成功登錄記錄
grep "Accepted" /var/log/auth.log

# 查看 root 登錄嘗試
grep "Failed password for root" /var/log/auth.log | wc -l

6.2 Nginx 5xx 錯誤排查

bash
# 統計 5xx 錯誤數量
grep " 5[0-9][0-9] " /var/log/nginx/access.log | wc -l

# 找出 5xx 錯誤的 URL Top 10
grep " 5[0-9][0-9] " /var/log/nginx/access.log | awk '{print $7}' | sort | uniq -c | sort -rn | head -10

# 查看詳細錯誤日誌
tail -n 100 /var/log/nginx/error.log

# 查看最近 1 小時的 5xx 錯誤
awk -v d="$(date -d '1 hour ago' '+%d/%b/%Y:%H:%M:%S')" '$4 > "["d {print $0}' /var/log/nginx/access.log | grep " 5[0-9][0-9] "

6.3 系統重啟/關機記錄

bash
# 查看系統重啟記錄
last reboot

# 查看關機記錄
last -x shutdown

# 查看登錄歷史
last
last -a  # IP 顯示在最後一列
lastb   # 登錄失敗記錄

# journald 方式
journalctl --list-boots
journalctl -b -1 -u sshd  # 上一次啟動時的 sshd 日誌

6.4 內存不足(OOM)排查

bash
# 搜索 OOM 記錄
grep -i "out of memory" /var/log/syslog
grep -i "oom-killer" /var/log/syslog

# 查看哪個進程被 kill
grep "Killed process" /var/log/syslog

# journald 方式
journalctl -k | grep -i oom
journalctl -p err -k

6.5 磁盤空間佔用排查

bash
# 找出最大的日誌文件
du -sh /var/log/* | sort -rh | head -10

# 查找大於 100M 的日誌文件
find /var/log -type f -size +100M -exec ls -lh {} \;

# 查看已刪除但仍被佔用的文件(釋放空間)
lsof | grep deleted | grep -i log

七、日誌安全與最佳實踐

7.1 日誌安全建議

  1. 集中化日誌:將日誌發送到獨立的日誌服務器,防止被攻擊者篡改
  2. 權限控制
    bash
    chmod 640 /var/log/auth.log
    chown root:adm /var/log/auth.log
  3. 日誌完整性:使用不可變位(防止被刪除/修改)
    bash
    chattr +a /var/log/auth.log  # 只能追加,不能刪除修改
  4. 定期備份:重要日誌異地備份
  5. 監控告警:錯誤日誌超過閾值及時告警

7.2 日誌管理最佳實踐

  1. 結構化日誌:應用程序輸出 JSON 格式日誌,便於分析
  2. 統一日誌格式:所有服務使用相同的時間戳格式
  3. 合理日誌級別:生產環境避免 debug 級日誌過多
  4. 請求追蹤 ID:分佈式系統添加 trace-id 串聯請求
  5. 定期審計:定期檢查異常登錄、權限變更等安全日誌

八、日誌分析工具推薦

8.1 命令行工具

  • lnav — 增強版日誌查看器,支持彩色高亮、過濾
  • ** multitail** — 多窗口同時跟蹤多個日誌
  • goaccess — Nginx/Apache 日誌實時分析,生成報表

8.2 集中化日誌系統

  • ELK Stack(Elasticsearch + Logstash + Kibana)— 經典組合
  • EFK Stack(Elasticsearch + Fluentd + Kibana)
  • Loki + Grafana — 輕量級日誌方案
  • Graylog — 開箱即用的日誌管理平臺

安裝 lnav 示例:

bash
# Ubuntu/Debian
apt install lnav

# 使用
lnav /var/log/syslog
lnav /var/log/nginx/access.log

九、總結

Linux 日誌管理是系統管理員的核心技能,本文涵蓋了:

  • ✅ Linux 日誌體系結構(設施、級別、常見日誌文件)
  • ✅ rsyslog 配置(本地日誌、遠程日誌、自定義規則)
  • ✅ systemd journald 使用(journalctl 常用命令)
  • ✅ 日誌輪轉(logrotate 配置與最佳實踐)
  • ✅ 日誌分析命令(grep、awk、sed 等實戰技巧)
  • ✅ 常見故障排查(SSH、Nginx、OOM 等)
  • ✅ 日誌安全與最佳實踐

掌握這些技能,你就能在系統出現問題時快速定位根因,成為高效的運維工程師。


相關閱讀:

最後更新於: