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

CentOS 4.x

如果这不是提问这个问题的适当的地方,我提前道歉。 它属于一个Linux服务器/ ITpipe理任务。

我在旧的CentOS 4.x服务器上有一个日志文件,我想删除比特定date更早的日志条目,并将它们放在一个新的文件中进行归档。

这是一个日志格式的例子:

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. (可选)压缩包含已删除事件的新归档日志文件。

我知道有这样做的日志旋转工具,但这应该只是一个一次性的任务,所以我不想设置。

补充笔记:

  • 如果date部分是棘手或资源密集型的,另一种方法是只保留最后的X行并移动其余部分。 我原本是tail -n 10000 > newfile.txt但这意味着将“好”日志移动到一个新的文件,然后做一个名称交换…然后我仍然需要删除“好“来自档案的条目。
  • 这个特定的日志文件是相当大的(1 GB),所以我宁愿任务尽可能资源和时间效率。
  • 日志中的额外pipe道涉及到我,我不确定是否需要在命令中额外保护以避免造成问题。

简单的事情可能会为你工作。

假设日志条目在一行上,并且行总是以YYYY-MM-DD开始,那么这样一个简单的脚本将按date分割日志文件。

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选项,所以你可以每天有一个日志文件。