Как я могу удалить старые записи журнала из файла журнала и заархивировать их где-нибудь еще в 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|

По сути, я ищу однострочник, который будет делать следующее:

  1. Найдите любые события старше указанного YYYY-MM-DD и удалите их из основного файла журнала.
  2. Возьмите удаленные события из шага 1 и поместите их в новый файл журнала
  3. (Необязательно) Сожмите новый архивный файл журнала, содержащий удаленные события.

Я знаю, что существуют инструменты ротации журналов, которые делают это, но это должна быть единовременная задача, поэтому я бы предпочел не настраивать ее.

Дополнительные примечания:

  • Если часть даты сложная или слишком ресурсоемкая, альтернативой было бы просто сохранить последние 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, так что вы можете иметь один файл журнала в день.

Другие вопросы по тегам