全文目錄
- 1 日志處理
- 1.1 實時日志分析
- 1.1.1 nginx日志配置
- 1.1.2 nginx日志示例
- 1.1.3 日志分析示例
- 1.2 多文件合并分析
- 1.3 時間范圍日志提取
- 2 問題追查
- 2.1 進程級問題定位
- 2.2 網絡連接排查
- 2.3 硬件故障追蹤
- 3 數據統計
- 3.1 磁盤空間預警
- 3.2 進程資源消耗排名
- 3.3 HTTP狀態碼統計
- 4 高級組合技巧
- 4.1 TCP連接狀態分析
- 4.2 日志時間戳轉換
- 4.3 多條件文件清理
- 5 參考文獻
寫在前面
前面的博文詳細梳理了《Linux日志處理命令完全解構 》和《從零開始掌握Linux數據流:管道與重定向完全指南》,從各個單一命令的原理介紹再到數據流如何在命令之間進行輸入和輸出,今天終于可以把前面的內容進行綜合應用,來完成本篇關于日志處理實戰應用的整理。
本文重點介紹幾種實戰中常用的利用管道來整合多命令達成預期處理效果的實戰應用,希望能夠給讀者帶來幫助。
1 日志處理
1.1 實時日志分析
1.1.1 nginx日志配置
http {log_format main '$remote_addr - $remote_user [$time_local] ''"$request" $status $body_bytes_sent ''"$http_referer" "$$http_user_agent" ''"$http_x_forwarded_for"';access_log /var/log/nginx/access.log main;
}
1.1.2 nginx日志示例
192.168.1.100 - - [27/Apr/2025:15:30:45 +0800] "GET /index.html HTTP/1.1" 200 612 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64)" "-"
192.168.1.100 - - [27/Apr/2025:15:30:45 +0800] "GET /index1.html HTTP/1.1" 500 612 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64)" "-"
192.168.1.100 - - [27/Apr/2025:15:30:45 +0800] "GET /index2.html HTTP/1.1" 500 612 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64)" "-"
192.168.1.100 - - [27/Apr/2025:15:30:45 +0800] "GET /index.html HTTP/1.1" 200 612 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64)" "-"
192.168.1.100 - - [27/Apr/2025:15:30:45 +0800] "GET /index.html HTTP/1.1" 400 612 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64)" "-"
192.168.1.100 - - [27/Apr/2025:15:30:45 +0800] "GET /index2.html HTTP/1.1" 502 612 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64)" "-"
192.168.1.100 - - [27/Apr/2025:15:30:45 +0800] "GET /index1.html HTTP/1.1" 504 612 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64)" "-"
1.1.3 日志分析示例
- 動態跟蹤Nginx日志,統計500錯誤的請求路徑出現次數
tail -f access.log | grep ' 500 ' | awk '{print $7}' | sort | uniq -c
- 統計近1000條日志,輸出請求路徑訪問次數最多的三個
tail -n 1000 access.log | awk '{print $7}' | sort -nr | uniq -c | head ‐3
- 統計某一時刻,504 錯誤訪問的URL及遠程id
grep "2025:15:30" access.log | awk -F' ' '$9==504 {print $1,$7}'| sort | uniq -c | sort -nr
1.2 多文件合并分析
- 合并多個日志文件,統計非本機IP的訪問量TOP20
cat access.log* | grep -v '127.0.0.1' | awk '{print $1}' | sort | uniq -c | sort -nr | head -20
1.3 時間范圍日志提取
- 提取MySQL服務在指定時間段內的死鎖日志(顯示上下文3行)
journalctl --since "2025-04-25 09:00" --until "2025-04-25 12:00" -u mysql | grep -C3 'deadlock'
2 問題追查
2.1 進程級問題定位
- 通過進程名定位PID,查詢相關進程打開的文件描述符(處理過程:過濾進程→提取PID→查看文件句柄)
ps aux | grep nginx | awk '{print $2}' | xargs -I{} lsof -p {}
2.2 網絡連接排查
- 篩選80端口監聽狀態,格式化輸出結果(處理過程:過濾監聽狀態→匹配端口→表格排版)
netstat -tulnp | awk '$6=="LISTEN" && $4~":80$"' | column -t
- 統計網絡連接情況
netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}' # TCP連接統計返回結果示例:
LAST_ACK 7
SYN_RECV 33
ESTABLISHED 159
FIN_WAIT1 51
FIN_WAIT2 90
TIME_WAIT 107解釋說明:
SYN_RECV:表示正在等待處理的請求數
ESTABLISHED:表示正常數據傳輸狀態
TIME_WAIT:表示處理完畢,等待超時結束的請求數
2.3 硬件故障追蹤
- 分析內核日志中錯誤信息,按設備名統計異常次數(處理過程:過濾錯誤→提取設備標識→統計頻次)
dmesg -T | grep -i error | awk -F'[: ]' '{print $1,$3}' | sort | uniq -c
3 數據統計
3.1 磁盤空間預警
- 檢測磁盤使用超80%的分區,郵件通知管理員
df -h | awk '+$5 > 80 {print $6,$5}' | column -t | mail -s "Disk Alert" zhangsan@example.com
3.2 進程資源消耗排名
- 顯示當前運行的進程信息,包括進程ID、父進程ID、命令名稱、內存使用百分比和CPU使用百分比,并按內存使用百分比降序排列,顯示前10條結果
ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%mem | head -n 10 | awk 'NR>1 {print $1,$4}'
3.3 HTTP狀態碼統計
- 統計日志中不同HTTP狀態碼出現次數(處理過程:提取狀態碼→排序計數→格式化輸出)
awk '{print $9}' access.log | sort | uniq -c | awk '{printf "狀態碼%s: %d次\n",$2,$1}'
4 高級組合技巧
4.1 TCP連接狀態分析
- 統計已建立連接的遠程端口分布
ss -tunap | awk '{print $1,$5}' | grep 'ESTAB' | awk -F':' '{print $2}' | sort | uniq -c|sort -nr
4.2 日志時間戳轉換
- 將日志中的時間轉換為Unix時間戳便于分析
grep 'ERROR' app.log | awk '{print $1,$2}' | xargs -I{} date -d "{}" +%s
4.3 多條件文件清理
- 刪除30天前且大于100MB的日志文件
find /logs -name "*.log" -mtime +30 -exec du -sh {} + | awk '$1 > 100M {print $2}' | xargs rm -vf
5 參考文獻
文獻1|文獻2|文獻3
寫在最后
以上有限的例舉了一些常用的組合式方法和命令來解決一些實際工作中的問題,這里僅是拋磚引玉,給讀者一個認知上的拓展,并不能梳理的特別全面,根據遇到的實際情況,需要做靈活調整,已達成預期的效果。如果對你有幫助,歡迎點贊和收藏,如有任何問題,也歡迎評論指正,一起加油!