Я ввожу файлы журнала через rsyslog, и моя конфигурация выглядит следующим образом:

root@rhel:/etc/rsyslog.d# head mail_prod_logs.conf
if $fromhost-ip=="10.10.10.10" and $programname=="AMP_Logs" then -/var/log/mail_logs/amp.log

Все мои журналы хранятся в папке /var/log/mail_logs/amp.log:

Oct 18 13:29:28 server.com AMP_Logs: Info: Begin Logfile
Oct 18 14:29:28 server.com AMP_Logs: Info: Version: 12.1.0-000 SN: .....
Oct 18 14:29:28 server.com AMP_Logs: Info: Time offset from UTC: -14400 seconds
Oct 18 15:29:23 server.com AMP_Logs: Info: Response received for.....
Oct 18 15:29:23 server.com AMP_Logs: Info: File reputation query.....
Oct 19 13:29:23 server.com AMP_Logs: Info: Response received for fil....
Oct 19 13:29:58 server.com AMP_Logs: Info: File reputation query ....
Oct 19 13:29:58 server.com AMP_Logs: Info: File reputation query ....

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

Так это выглядело бы так:

/var/log/mail_logs/Sep/30/23.log
/var/log/mail_logs/Oct/01/00.log
/var/log/mail_logs/Oct/01/01.log
/var/log/mail_logs/Oct/01/02.log
...

Как я могу это сделать?

2
sectechguy 18 Окт 2019 в 22:45

2 ответа

Лучший ответ

Вы можете сделать это с помощью динамического шаблона файла. Используйте заменитель свойства, чтобы выбрать части %timestamp% свойство, в частности параметр date-day и date-hour, а также символы с 1 по 3 из date-rfc3164 (это строка типа "9 октября 09:47:08"). Обычно в примерах шаблон называется DynFile:

$template DynFile,"/var/log/mail_logs/%timestamp:1:3:date-rfc3164%/%timestamp:::date-day%/%timestamp:::date-hour%.log"

Чтобы использовать шаблон, замените ...then -/var/log/mail_logs/amp.log на ...then -?DynFile.

Если вы хотите заменить трехбуквенный месяц (январь, февраль, ...) на двухзначный месяц для упрощения обработки, используйте вместо этого

$template DynFile,"/var/log/mail_logs/%timestamp:::date-month%/%timestamp:::date-day%/%timestamp:::date-hour%.log
1
meuh 19 Окт 2019 в 12:24

Предполагая, что ваши строки журнала так хорошо сформированы, как предполагает фрагмент, это будет началом:

awk '{
      dir=$1 "/" $2; log_file=dir "/" substr($3, 1, 2) ".log"
      if (!exists[dir]++) {system("mkdir -p " dir)}; 
      print > log_file
}' amp.log

Вы бы выполнили это в /var/log/mail_logs/.

Вызов system внешней команды mkdir создает каталог для конкретной даты, если он не существует. Передача -p приводит к тому, что родители создаются по мере необходимости (поэтому каталог Oct создается, когда mkdir -p /Oct/01 впервые запускает October). Кроме того, -p гарантирует, что mkdir не сообщит об ошибке, если каталог уже существует.

Вызов print записывает строки журнала в файл, имя которого создается из компонентов времени журнала. Каждый новый файл журнала создается при первой записи и дополняется в течение времени существования команды.

Вы можете изменить print > на print >>, если вы предпочитаете, чтобы файл журнала на основе даты и времени из предыдущего запуска awk был добавлен, а не перезаписан.

1
iruvar 19 Окт 2019 в 20:44