tail 是 Linux 運維、開發、安全分析最高頻的日誌觀測工具。除基礎「顯示最後 10 行」外,其 -f 追蹤、-c/-n 精準定位、--pid 進程綁定、多文件合並等進階特性,能構建零依賴的實時監控體系。
| 參數 | 功能 | 典型場景 |
|---|---|---|
-n N / -N | 顯示最後 N 行 (默認 10) | tail -n 100 /var/log/nginx/access.log |
-c N | 顯示最後 N 字節 | tail -c 1024 huge.log 快速查看尾部 |
-f / --follow | 實時追蹤文件增長 (默認跟隨文件描述符) | tail -f /var/log/messages |
-F | -f --retry 組合:文件被旋轉/重建後自動重新打開 | tail -F /var/log/nginx/access.log 生產首選 |
--pid=PID | 指定進程結束時自動退出追蹤 | tail -f --pid=$$ /var/log/app.log 腳本自清理 |
-q / --quiet | 多文件時不顯示文件名標題 | tail -q -n 5 /var/log/*.log |
-v / --verbose | 始終顯示文件名標題 | 多文件對比 |
-s SEC | 追蹤輪詢間隔 (默認 1.0s) | tail -f -s 0.1 /var/log/fast.log 低延遲 |
-r | 逆序輸出 (BSD 扩展,GNU 無) | tail -r -n 20 file (macOS/FreeBSD) |
--lines=+N | 從第 N 行開始顯示 (而非最後 N 行) | tail -n +100 file 跳過頭部 |
# 單文件
tail -F /var/log/nginx/access.log
# 多文件合並追蹤 (帶文件名標題)
tail -F -v /var/log/nginx/access.log /var/log/nginx/error.log
# 過濾關鍵字實時高亮
tail -F /var/log/nginx/access.log | grep --color=always -E "ERROR|5[0-9]{2}|timeout"
💡 -F = --follow=name --retry:以文件名而非 fd 追蹤,logrotate 旋轉後自動銜接新文件,**不漏行、不報錯**。
# 最後 500 字節 (二進制日誌/大文件快速瞄尾部)
tail -c 500 /var/lib/mysql/binlog.000123
# 從第 1000 行開始顯示 (跳過頭部)
tail -n +1000 huge.log
# 結合 head 截取中間段落 (第 100-200 行)
head -n 200 huge.log | tail -n 101
# 或 sed -n '100,200p' huge.log
#!/bin/bash
# monitor.sh - 監控應用日誌,應用退出自動停止 tail
APP_CMD="./myapp"
LOG_FILE="/var/log/myapp.log"
$APP_CMD &
APP_PID=$!
# 追蹤日誌,應用結束自動退出
tail -F --pid=$APP_PID $LOG_FILE | while read line; do
echo "[$(date '+%H:%M:%S')] $line"
# 可在此處理告警邏輯
done
wait $APP_PID
echo "Application exited, tail stopped."
# 合並多個訪問日誌提取 TOP 10 IP (近似實時)
tail -F -q /var/log/nginx/access*.log | \
awk '{print $1}' | \
sort | uniq -c | sort -nr | head -10
# 實時統計狀態碼分布 (每 10 秒刷新)
tail -F -q /var/log/nginx/access.log | \
awk '{code[$9]++} NR%100==0 {for(c in code) printf "%s:%d ", c, code[c]; print ""}'
# 先看最後 50 行歷史,再無縫進入實時追蹤
(tail -n 50 /var/log/app.log; tail -F /var/log/app.log) | less +F
# less +F 進入追蹤模式,Ctrl+C 退回瀏覽,Shift+F 再進追蹤
# 假設日誌為 JSON Lines 格式
tail -F /var/log/app.json.log | \
jq --unbuffered -r 'select(.level=="ERROR") | "\(.time) [\(.level)] \(.message)"' | \
while read line; do
# 告警推送
curl -X POST -d "text=$line" https://webhook.site/xxx
done
jq --unbuffered 關鍵:禁用緩衝,確保實時行級輸出。
| 坑點 | 現象 | 規避 |
|---|---|---|
用 -f 而非 -F | logrotate 後 tail 仍抓舊 fd,新日誌不見 | 生產環境**強制使用 -F** |
| 管道緩衝導致延遲 | tail -f log | grep "ERR" 幾秒才出 | grep --line-buffered / awk '{print; fflush()}' / stdbuf -oL |
| 二進制文件輸出亂碼 | 終端顯示控制字符、亂碼 | tail -c 100 bin.log | xxd / strings / od -c |
大文件 tail -n 100000 緩慢 | 須從頭掃描換行符 | 用 tail -c 估算字節偏移,或 less +G 交互式 |
| 多文件無文件名 | 無法區分來源 | 加 -v 強制顯示標題 |
| 工具 | 優勢 | 劣勢 | 推薦場景 |
|---|---|---|---|
tail -F | 零依賴、標準輸出、管道友好 | 無持久化、無查詢語言 | 臨時觀測、腳本集成 |
less +F | 雙模式(瀏覽/追蹤)、搜尋、跳轉 | 交互式、難管道 | 人工排查 |
multitail | 多窗口、高亮、過濾、合並視圖 | 需安裝、TUI 只能交互 | 多日誌並行監控 |
lnav | SQL 查詢、自動解析時間/級別、圖表 | 學習曲線、資源佔用高 | 深度日誌分析 |
journalctl -f | 系統日誌權威源、結構化字段 | 僅 systemd 日誌 | 系統級排查 |
| 商業 APM (Datadog/ELK) | 全鏈路、告警、儀表板、保留 | 成本、部署複雜 | 生產級可觀測體系 |
生產環境尾部觀測鐵律:
tail -F -v抗旋轉、--pid自清理、stdbuf -oL破緩衝、結構化日誌配jq --unbuffered。
熟練掌握 tail 進階用法,讓日誌從「事後諸葛」變為「實時雷達」。