本文目录导读:

在Shell脚本中实时跟踪日志新增内容,最经典和常用的方法是使用 tail -f 命令,这里为你整理了几种常见的实现方式及进阶技巧:
基础方法:tail -f
这是最直接的方式,会实时输出日志文件的新增内容:
tail -f /var/log/syslog
更高效的方式:tail -F
-F 比 -f 更强,它会追踪文件描述符,即使日志文件被轮转(rename/truncate)也能继续追踪:
tail -F /var/log/app.log
结合其他命令实时处理
带时间戳输出
tail -f app.log | while read line; do
echo "$(date '+%Y-%m-%d %H:%M:%S') $line"
done
实时过滤和告警
tail -f app.log | while read line; do
if echo "$line" | grep -q "ERROR"; then
echo "⚠️ 发现错误: $line"
# 可以发送邮件或通知
fi
done
使用 inotifywait(更高效)
对于需要精确控制或日志文件非常大的场景,使用 inotifywait 更高效:
#!/bin/bash
LOGFILE="/var/log/app.log"
# 先显示已有内容
tail -n 0 "$LOGFILE"
# 监控文件变化
inotifywait -m -e modify "$LOGFILE" | while read; do
tail -n 1 "$LOGFILE"
done
完整实时监控脚本示例
#!/bin/bash
LOG_FILE="$1"
KEYWORDS=("ERROR" "WARNING" "FATAL")
if [ -z "$LOG_FILE" ]; then
echo "用法: $0 <日志文件路径>"
exit 1
fi
echo "开始监控: $LOG_FILE"
echo "按 Ctrl+C 退出"
tail -F "$LOG_FILE" | while read line; do
timestamp=$(date '+%Y-%m-%d %H:%M:%S')
# 检查是否包含关键字
for keyword in "${KEYWORDS[@]}"; do
if echo "$line" | grep -qi "$keyword"; then
echo "[$timestamp] [${keyword}] $line"
break
fi
done
done
常用参数对比
| 参数 | 作用 | 适用场景 |
|---|---|---|
-f |
跟踪文件变化 | 基本日志跟踪 |
-F |
跟踪文件,支持轮转 | 生产环境日志 |
-n 10 |
显示最后10行后开始跟踪 | 只看新增内容 |
-q |
安静模式,减少输出 | 脚本中使用 |
注意事项
- 资源消耗:长时间运行
tail -f会占用一定资源 - 日志轮转:使用
-F而不是-f处理日志轮转 - 退出方式:按
Ctrl+C退出跟踪 - 管道阻塞:管道后的命令要能实时处理,避免缓冲区阻塞
高级用法:使用 less +F
如果你已经开始使用 less 查看日志,可以按 Shift+F 进入跟踪模式,相当于 tail -f:
less +F app.log # 直接进入跟踪模式 # 或者在 less 中按 F 键切换
选择哪种方式取决于你的具体需求:
- 简单查看:
tail -f - 生产环境:
tail -F - 需要处理内容:管道配合
while read - 需要监控文件系统事件:
inotifywait