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

日誌是 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)
| 級別 | 數值 | 說明 |
|---|---|---|
| emerg | 0 | 緊急,系統不可用 |
| alert | 1 | 警報,需立即處理 |
| crit | 2 | 嚴重錯誤 |
| err | 3 | 錯誤 |
| warning | 4 | 警告 |
| notice | 5 | 通知(正常但重要) |
| info | 6 | 信息 |
| debug | 7 | 調試信息 |
1.3 日誌設施(Facility)
| 設施 | 說明 |
|---|---|
| kern | 內核消息 |
| user | 用戶級消息 |
| 郵件系統 | |
| daemon | 系統守護進程 |
| auth | 認證/安全 |
| syslog | syslog 內部消息 |
| lpr | 打印系統 |
| news | 新聞組 |
| uucp | UUCP 系統 |
| cron | 定時任務 |
| local0~local7 | 本地自定義(共 8 個) |
二、rsyslog 配置詳解
2.1 配置文件結構
rsyslog 的主配置文件:
/etc/rsyslog.conf— 主配置/etc/rsyslog.d/*.conf— 子配置目錄(推薦)
基本語法:
設施.級別 動作示例:
# 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 # TCP2.2 自定義日誌規則
為應用程序配置獨立的日誌文件:
# /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 生效:
systemctl restart rsyslog
systemctl status rsyslog2.3 接收遠程日誌(服務端配置)
# /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 端口:
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 基本命令
# 查看所有日誌
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 高級過濾
# 按級別過濾(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
[Journal]
# 存儲位置:auto(默認,優先持久化)、persistent(持久化)、volatile(僅內存)、none(不記錄)
Storage=persistent
# 日誌佔用磁盤空間限制
SystemMaxUse=1G
SystemKeepFree=500M
SystemMaxFileSize=100M
# 日誌保留時間
MaxRetentionSec=1month
# 單條消息最大大小
LineMax=48K啟用持久化日誌:
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 日誌輪轉示例:
# /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 手動測試
# 調試模式(不實際執行)
logrotate -d /etc/logrotate.d/nginx
# 強制執行(即使不到時間)
logrotate -f /etc/logrotate.d/nginx
# 查看 logrotate 定時任務
cat /etc/cron.daily/logrotate五、日誌分析常用命令
5.1 grep 系列
# 搜索包含關鍵詞的行
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
# 實時跟蹤日誌
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/syslog5.3 awk 高級分析
# 提取某一列(空格分隔)
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 -205.4 其他實用命令
# 去重統計
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 登錄失敗排查
# 查看所有登錄失敗記錄
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 -l6.2 Nginx 5xx 錯誤排查
# 統計 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 系統重啟/關機記錄
# 查看系統重啟記錄
last reboot
# 查看關機記錄
last -x shutdown
# 查看登錄歷史
last
last -a # IP 顯示在最後一列
lastb # 登錄失敗記錄
# journald 方式
journalctl --list-boots
journalctl -b -1 -u sshd # 上一次啟動時的 sshd 日誌6.4 內存不足(OOM)排查
# 搜索 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 -k6.5 磁盤空間佔用排查
# 找出最大的日誌文件
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 日誌安全建議
- 集中化日誌:將日誌發送到獨立的日誌服務器,防止被攻擊者篡改
- 權限控制:bash
chmod 640 /var/log/auth.log chown root:adm /var/log/auth.log - 日誌完整性:使用不可變位(防止被刪除/修改)bash
chattr +a /var/log/auth.log # 只能追加,不能刪除修改 - 定期備份:重要日誌異地備份
- 監控告警:錯誤日誌超過閾值及時告警
7.2 日誌管理最佳實踐
- 結構化日誌:應用程序輸出 JSON 格式日誌,便於分析
- 統一日誌格式:所有服務使用相同的時間戳格式
- 合理日誌級別:生產環境避免 debug 級日誌過多
- 請求追蹤 ID:分佈式系統添加 trace-id 串聯請求
- 定期審計:定期檢查異常登錄、權限變更等安全日誌
八、日誌分析工具推薦
8.1 命令行工具
- lnav — 增強版日誌查看器,支持彩色高亮、過濾
- ** multitail** — 多窗口同時跟蹤多個日誌
- goaccess — Nginx/Apache 日誌實時分析,生成報表
8.2 集中化日誌系統
- ELK Stack(Elasticsearch + Logstash + Kibana)— 經典組合
- EFK Stack(Elasticsearch + Fluentd + Kibana)
- Loki + Grafana — 輕量級日誌方案
- Graylog — 開箱即用的日誌管理平臺
安裝 lnav 示例:
# 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 等)
- ✅ 日誌安全與最佳實踐
掌握這些技能,你就能在系統出現問題時快速定位根因,成為高效的運維工程師。
相關閱讀: