Разделить файлы журнала Laravel по дате - PullRequest
0 голосов
/ 28 июня 2018

Я унаследовал систему Laravel с большим единственным файлом журнала, размер которого в настоящее время составляет около 17 ГБ, теперь я чередую будущие файлы журнала ежемесячно, однако мне нужно разделить существующий журнал по месяцам.

Дата форматируется как гггг-мм-дд чч: мм: сс («[2018-06-28 13:32:05]»). Кто-нибудь знает, как я могу выполнить разделение, используя только сценарии bash (например, с помощью awk, sed и т. Д.).

Имя входного файла: laravel.log. Я хотел бы, чтобы выходные файлы имели такой формат, как laravel-2018-06.log.

Помощь очень ценится.

1 Ответ

0 голосов
/ 28 июня 2018

Поскольку предоставленная вами информация немного скудна, я сделаю следующие предположения:

  • каждая запись в журнале представляет собой одну строку
  • где-то всегда есть одна строка вида [yyyy-mm-dd hh:mm:ss], если их больше, мы берем первую.
  • ваш лог-файл отсортирован по времени.

Регулярное выражение, соответствующее вашей дате,

\\[[0-9]{4}(-[0-9]{2}){2} ([0-9]{2}:){2}[0-9]{2}\\]

или чуть менее строгий

\\[[-:0-9 ]{19}\\]

Таким образом, мы можем использовать это в сочетании с match(s,ere), чтобы получить желаемую строку:

awk 'BEGIN{ere="\\[[0-9]{4}(-[0-9]{2}){2} ([0-9]{2}:){2}[0-9]{2}\\]"}
     { match($0,ere); fname="laravel-"substr($0,RSTART+1,7)".log" }
     (fname != oname) { close(oname); oname=fname }
     { print > oname }' laravel.log

Поскольку вы говорите, что ваш файл немного большой, вы можете сначала проверить это на подмножестве, которое занимает пару месяцев.

$ head -10000 laravel.log > laravel.head.log
$ awk '{...}' laravel.head.log
$ md5sum laravel.head.log
$ cat laravel.*-*.log | md5sum

Если md5sum не совпадает, у вас может быть проблема.

...