Назад | Перейти на главную страницу

Как я могу удалить старые записи журнала из файла журнала и заархивировать их где-нибудь еще в Linux?

CentOS 4.x

Заранее прошу прощения, если это не подходящее место, чтобы задать этот вопрос. Это относится к задаче администратора linux / ИТ-администратора.

У меня есть файл журнала на старом сервере 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. Найдите любые события старше указанного ГГГГ-ММ-ДД и удалите их из основного файла журнала.
  2. Возьмите удаленные события из шага 1 и поместите их в новый файл журнала.
  3. (Необязательно) Сожмите новый архивный файл журнала, содержащий удаленные события.

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

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

Что-нибудь простое может сработать для вас.

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