根据写入行的时间切割文件片段

根据写入行的时间切割文件片段

我有一个始终运行的进程,日志文件可能达到 5 GB,有时我必须根据时间间隔截取此日志的一部分(通常我使用 dd)。 linux中有没有命令可以根据时间间隔获取日志切片?

PS:此日志中的大多数行都没有时间戳。

答案1

如果没有允许您执行此操作的命令(如 Wiese 建议的那样),为什么不创建文件的外部索引呢?

只是想法:您可以编写一个永远运行的脚本(或者几乎参见下面的注释),并给出创建索引的时间间隔。

PIDofThisInstance=$$
# ... you code for the header, checks... 
while true  ; do
  # This is the core of your cycle
    sync   # Maybe
    CurrentSize=`ls -s $MyFile  | awk '{print $1} ' `
    CurrentTime=`date +"%Y%m%d%H%M%S"`
    echo $CurrentTime $CurrentSize >> $Log_Of_My_Log_File
    sleep $TimeToSleep
  # if (exit-condition)
  # then
  #    break           #Exit from the infinite loop.
  # fi
done 

之后,您可以执行另一个脚本,给出开始/结束日期/时间,并回答您的开始/结束尺寸。从这些数字中你可以剪切你的文件。

你说的是一个很大的文件。所以我不建议你这样做行号有可能head MyFile.log -n xxx | tail -n yyy。会很长。更好地处理尺寸。

笔记:

  • 如果这是一个带有格式化输出的日志(即使您不知道),那么它总是可能存在来自开发公司/程序员的某种分析工具。即使多年后它也可能会出现。恕我直言,最好不要触及该格式并创建一个单独的文件。
  • 写入你的脚本参数,例如当前的PID(如果你需要手动杀死),文件名(日志对象),如果你知道生成日志的程序的PID...
  • 如果您遇到以下情况,则循环可以永远或结束:生成日志的程序的PID不再存在,文件不再存在,实际大小小于旧的(您移动文件或重新启动日志(您需要重新启动索引)。
  • 如果您将 $LastSize 保留在内存中,您可以决定避免在不需要时在“日志的日志”中打印行,或者在很长时间没有活动后停止(或动态修改时间间隔...)

相关内容