如何从日志文件中删除旧日志条目并将其存档到 Linux 中的其他位置?

如何从日志文件中删除旧日志条目并将其存档到 Linux 中的其他位置?

CentOS 4.x

如果这里不适合问这个问题,我提前道歉。它涉及 Linux 服务器/IT 管理任务。

我在旧的 CentOS 4.x 服务器上有一个日志文件,我想删除早于某个日期的日志条目并将它们放在新文件中进行存档。

以下是日志格式的示例:

2012-06-07 22:32:01,289 ABC:0|Foo|Foo2|4.4|1234|Some Event|123|blah blah blah
2012-06-07 22:32:03,289 ABC:0|Foo|Foo2|4.4|1234|Some Event|123|blah blah blah
2012-06-07 22:32:04,289 ABC:0|Foo|Foo2|4.4|1234|Some Event|123|
2012-06-07 22:32:10,289 ABC:0|Foo|Foo2|4.4|1234|Some Event|123|blah blah blah
2012-06-07 22:32:12,289 ABC:0|Foo|Foo2|4.4|1234|Some Event|123|blah blah blah
2012-06-07 22:32:15,289 ABC:0|Foo|Foo2|4.4|1234|Some Event|123|
2012-06-07 22:32:40,289 ABC:0|Foo|Foo2|4.4|1234|Some Event|123|blah blah blah
2012-06-07 22:32:58,289 ABC:0|Foo|Foo2|4.4|1234|Some Event|123|blah blah blah
2012-06-07 22:33:01,289 ABC:0|Foo|Foo2|4.4|1234|Some Event|123|
2012-06-07 22:33:01,289 ABC:0|Foo|Foo2|4.4|1234|Some Event|123|blah blah blah
2012-06-07 22:33:02,289 ABC:0|Foo|Foo2|4.4|1234|Some Event|123|

本质上,我正在寻找一个可以执行以下操作的单行程序:

  1. 查找任何早于提供的 YYYY-MM-DD 的事件并将其从主日志文件中删除。
  2. 取出步骤 1 中删除的事件并将其放入新的日志文件中
  3. (可选)压缩保存已删除事件的新存档日志文件。

我知道有一些日志旋转工具可以执行此操作,但这应该只是一次性任务,所以我不想设置它。

补充笔记:

  • 如果日期部分比较棘手或占用太多资源,另一种方法是只保留最后 X 行并移动其余行。我最初考虑的是类似的做法,tail -n 10000 > newfile.txt但这意味着将“好”日志移动到新文件,然后进行名称交换……然后我仍然需要从存档中删除“好”条目。
  • 这个特定的日志文件非常大(1 GB),所以我希望这项任务尽可能节省资源和时间。
  • 日志中的额外管道让我担心,我不确定是否需要在命令中添加额外的保护以避免其引起问题。

答案1

一些简单的事情可能对你有用。

假设日志条目在一行上,并且每行总是以 开头,YYYY-MM-DD那么像这样的简单脚本就会按日期拆分日志文件。

logsplit:使用 cat logfile | logsplit

#!/bin/bash
LOGBASEPATH=/logfilepath/logfile
while read LOGLINE ; do
  [[ -z ${LOGLINE} ]] && continue # skip empty
  dayprefix=`echo $LOGLINE | cut -d ' ' -f 1`
  echo $LOGLINE  > $LOGBASEPATH/logname.$dayprefix
done

这将与 logrotate 选项完美匹配,dateext以便您每天可以拥有一个日志文件。

相关内容