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|
本质上,我正在寻找一个可以执行以下操作的单行程序:
- 查找任何早于提供的 YYYY-MM-DD 的事件并将其从主日志文件中删除。
- 取出步骤 1 中删除的事件并将其放入新的日志文件中
- (可选)压缩保存已删除事件的新存档日志文件。
我知道有一些日志旋转工具可以执行此操作,但这应该只是一次性任务,所以我不想设置它。
补充笔记:
- 如果日期部分比较棘手或占用太多资源,另一种方法是只保留最后 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
以便您每天可以拥有一个日志文件。