Shell脚本如何实时跟踪日志新增内容

wen 实用脚本 1

本文目录导读:

Shell脚本如何实时跟踪日志新增内容

  1. 基础方法:tail -f
  2. 更高效的方式:tail -F
  3. 结合其他命令实时处理
  4. 使用 inotifywait(更高效)
  5. 完整实时监控脚本示例
  6. 常用参数对比
  7. 注意事项
  8. 高级用法:使用 less +F

在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

抱歉,评论功能暂时关闭!