Разделить файлы журнала Laravel по дате

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

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

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

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


person Chris Rowles    schedule 28.06.2018    source источник
comment
Действительно ли дата и время заключены в квадратные скобки? Пожалуйста, опубликуйте несколько примеров строк ввода. Прочитайте Как задать хороший вопрос? и улучшите свой вопрос.   -  person glenn jackman    schedule 28.06.2018
comment
Продолжаю по просьбе @glennjackman. Пожалуйста, четко укажите, находится ли запись журнала в одной строке или в нескольких строках. и если первая запись - это дата. Кроме того, я бы не делил на месяц, а больше на год-месяц.   -  person kvantour    schedule 28.06.2018
comment
Полезно: stackoverflow.com/questions/36636175/ и unix.stackexchange.com/questions/392238/ и, возможно, даже stackoverflow.com/questions/36636175/   -  person kvantour    schedule 28.06.2018


Ответы (1)


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

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

person kvantour    schedule 28.06.2018