我有一个始终运行的进程,日志文件可能达到 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 保留在内存中,您可以决定避免在不需要时在“日志的日志”中打印行,或者在很长时间没有活动后停止(或动态修改时间间隔...)