Как я могу удалить старые записи журнала из файла журнала и заархивировать их где-нибудь еще в Linux?
CentOS 4.x
Я заранее прошу прощения, если это не подходящее место, чтобы задать этот вопрос. Это относится к задаче linux server / IT admin.
У меня есть файл журнала на старом сервере 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 ГБ), поэтому я бы предпочел, чтобы задача была как можно более ресурсоемкой и эффективной.
- Меня беспокоит лишние каналы в журнале, и я не уверен, что мне понадобится дополнительная защита в командах, чтобы избежать проблем.
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
Это будет хорошо соответствовать dateext
опция logrotate, так что вы можете иметь один файл журнала в день.