← 返回

Linux 上截取大文件日志信息并下载到本地的脚本

复制为 Markdown

在服务器上,常常一个后端程序的日志文件多达 5~10GB,在遇到系统宕机或其它难以排查的意外情况时,需要将最近一段时间的日志信息下载到本地,分析原因或者上传到日志平台保存。

假设日志文件中的每一行开头都有一个形如 “2026-02-11 11:49:07.358” 的 YYYY-MM-DD HH:MM:SS.mmm 格式的时间戳。

截取最近 30 分钟的日志信息

可以用下面的脚本截取最近 30 分钟的日志并单独保存为文件:

sh
#!/bin/bash

# 计算半小时前的时间戳(秒)
THRESHOLD_SEC=$(date -d '30 minutes ago' +%s)

# 定义日志文件路径
LOG_FILE="./tomcat_spring.log"

echo "正在查找 $LOG_FILE 中最近 30 分钟的日志..."

# 使用 here document 将 awk 脚本传递给 awk 命令
awk -v thresh="$THRESHOLD_SEC" -v log_file="$LOG_FILE" '
BEGIN { 
    # 可以在这里添加初始化代码,如果需要的话
}
{
    # 提取每行开头的 "YYYY-MM-DD HH:MM:SS" 部分
    # 日志格式是 "YYYY-MM-DD HH:MM:SS.mmm ...",所以前19个字符是 "YYYY-MM-DD HH:MM:SS"
    datetime_part = substr($0, 1, 19)
    
    # 使用系统 date 命令将该字符串转换为秒数进行比较
    # 注意:这里必须使用双引号,并且内部的双引号需要转义
    cmd = "date -d \"" datetime_part "\" +%s 2>/dev/null"
    cmd | getline log_time_sec
    close(cmd)

    # 如果解析成功且日志时间 >= 半小时前的时间,则打印该行
    if (log_time_sec != "" && log_time_sec >= thresh) {
        print $0
    }
}
' "$LOG_FILE" > recent_30min_log.txt

echo "提取完成,结果已保存到 recent_30min_log.txt"

然后将其下载到本地:

sh
scp your_username@your_server_ip:/path/to/recent_30min_log.txt /local/path/on/your/computer/

截取当天的堆栈信息

sh
grep "^2026-02-11 " /path/to/your/app.log > today_log.txt
最热文章