如果你需要将Laravel的日志倒入ELK进行统计查看,就会发现默认的日志格式并不能被Logstash认识,你需要进行各种正则判断,参数转换。如果你使用的是Laravel5.6以上版本,那么恭喜,有非常优雅的方案通过配置即可完成。

这里主要用到channels的方案,通过再自定义话配置一种日志记录方式来实现。

思路

使用stack channel搭配,生成默认的日志和一份json形式的日志。

josn形式的日志通过monolog提供的方法实现。

代码

File: config/logging.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
'channels' => [
'stack' => [
'driver' => 'stack',
'channels' => ['daliy', 'logstash'], // channel的组合
],
// ...
'logstash' => [
'driver' => 'monolog',
'level' => 'debug',
'handler' => Monolog\Handler\RotatingFileHandler::class,
'formatter' => Monolog\Formatter\LogstashFormatter::class,
'with' => [
'filename' => storage_path('jsonlogs/laravel.log'), // 自定义文件存放路径
'maxFiles' => 14 // 自定义最大文件保存数目
],
'formatter_with' => [
'applicationName' => env('APP_NAME'), // 自定义应用名称
]
],
]

这里看到使用handlerformatter来搭配进行日志的处理和格式化。

其中Monolog默认库里提供可选用的有很多,具体看文档

另外需要注意的则是withformatter_with两个参数,这是为handlerformatter分别实例化提供必要参数的方式,具体提供哪些必要参数可以查看Class的代码。

这样,就可以使用Filebeat来检测jsonlogs/*.log并上传到ELK中分析。