按日期拆分Laravel日志文件

时间:2018-06-28 12:54:50

标签: bash unix awk sed logfile

我继承了Laravel系统,其中包含一个大型的单个日志文件,当前的大小约为17GB,现在我每月轮换将来的日志文件,但是我需要按月拆分现有日志。

日期格式为yyyy-mm-dd hh:mm:ss(“ [2018-06-28 13:32:05]”)。有人知道我如何仅使用bash脚本(例如通过使用awk,sed等)执行拆分。

输入文件名为laravel.log。我希望输出文件具有laravel-2018-06.log这样的格式。

不胜感激。

1 个答案:

答案 0 :(得分:0)

由于您提供的信息很少,我将遵循以下假设:

  • 每个日志条目都是一行
  • 总有一个[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不匹配,则可能有问题。