文章目录
- 了解系统的默认支持
- 多个通道时它们的关系
- 如何使用
- 驱动
- 默认日志是同步的
了解系统的默认支持
Laravel 日志基于「 通道 」和 「 驱动 」的。那么这个通道是干嘛的?驱动又是干嘛的?
通道 :
1.它表示了某种日志格式化的方式(或可理解为某个模块的日志)。
2.它配置了日志的输出方式,例如单个文件、每日一个文件、发送请求到日志服务器等。
3.它的配置可能支持锁、文件权限等,这要看这个通道是否提供支持。
驱动 :
确定日志消息的实际记录方式和位置(或理解为输出或写入内容的工具类)。
上面流程图很重要,注意通道可以配置一个,也可以配置多个,也就是说支持配置日志同时写入多个通道进行输出。下面是默认的logging.php
配置内容的一些注释。
'default' => env('LOG_CHANNEL', 'stack'), //这里表示Log门面默认使用stack通道作为日志驱动,这是一个可以创建『多通道』通道的包装器。
'channels' => [ //channels数组:是laravel系统所有支持的“通道”都配置在这里 /** 下面着重说明一下stack:stack下又有一个channels配置,这里就是为什么我上面的流程图中表示的“它可以实现将日志同时输出到多处”,如记录在本地laravel-[date].log中,并同时发送至日志服务器: 127.0.0.1:8080/xxx(下面“多个通道时它们的关系”会提到),下面显示系统默认的配置并解释:*/'stack' => ['driver' => 'stack', // 使用“stack驱动”,这与父级的“stack通道”是不同的'channels' => ['single'], // 默认的配置文件使用了单个文件输出'ignore_exceptions' => false, //默认不忽略异常],...
]# 官方解释 ignore_exceptions=>true 时忽略每个子处理程序引发的异常。例如这允许您忽略远程tcp连接可能已断开但不希望整个应用程序崩溃的问题,并且可能希望继续登录到其他处理程序。
多个通道时它们的关系
官方给了两个很重要也很典型的日志驱动方式single
和daily
。如果没有合理配置的话,可能不能达到你期望的效果;并且多个配置之间存在会相互影响,所以要小心配置。
多个通道一起使用时,要了解每个通道的每个配置项,尤其是能相互影响的配置项。
名称 | 描述 | 默认值 |
---|---|---|
bubble | 【重要】表示是否在处理后将消息传递到其他频道 | true |
locking | 在写入日志文件之前尝试锁定日志文件 | false |
permission | 日志文件的权限 | 0644 |
配置示例:
'default' => env('LOG_CHANNEL', 'stack'),
'channels' => ['stack' => ['driver' => 'stack','channels' => ['daily', 'slack'], // 这里配置了2个通道,它们是顺序的'ignore_exceptions' => false,],'daily' => ['driver' => 'daily', // 按天生成日志文件'bubble' => false, // 默认为 false , 当设置为true时表示不在传递到其他通道'path' => storage_path('logs/laravel.log'),'level' => env('LOG_LEVEL', 'debug'), // 什么级别的日志记录在文件中?'days' => 14,],'slack' => ['driver' => 'slack', // 将日志发送到Slack服务'url' => env('LOG_SLACK_WEBHOOK_URL'), // 某服务地址'username' => 'Laravel Log','emoji' => ':boom:','level' => env('LOG_LEVEL', 'debug'), //默认critical,注意自己允许的日志级别],
]
上面示例中,使用 stack 作为默认的通道(因为Log门面默认只能设置一种通道),而这里又给 stack 配置了2个通道,这样就实现了日志既能保存在本地文件laravel-[date].log
中,又能将日志请求至URL(slack的配置);其中当设置bubble => true
表示不再传递到其它通道,所以当为stack配置多个通道时要注意使用默认值或false
。还有每个通道都应设置level
允许的日志级别,默认slack.level
是允许critical
级别,它不会发送debug
、info
等日志到Slack服务
。
如何使用
Laravel框架提供了八个级别的日志方法和info()
、logger()
两个辅助函数,使用时也可以指定单个或多个通道Log::channel("sms-log")->info($txt)
,这里不多说了,可以看官方文档。
# 这里还有2个.env的配置会影响日志,做个说明
APP_ENV=production # 这里会显示在日志内容中
LOG_LEVEL=debug # 这里在配置什么级别的日志写入某通道时很关键
自定义一个短信日志(通道)示例:
channels => [...'sms-xxx' => [ //定义xxx短信日志'driver' => 'daily', // 采用按天生成日志文件的驱动'path' => storage_path('logs/sms-xxx.log'), // 这样会生产 sms-log-2024-01-01.log 文件名格式的日志'days' => 0, //注释掉,看源码未配置时默认是7天,想实现永久设置为0],...
]// 使用时调用写入指定sms-xxx通道:
Log::channel("sms-log")->info($txt); // 每个通道都可以使用这个8个级别的日志类型。这样指定的方式可以实现某个模块想单独记录一个日志文件的场景
驱动
上面‘如何使用’章节,定义的sms-xxx
通道使用了每日一个日志文件的daily
驱动。看到此配置更有利于理解通道与驱动的关系。
系统默认支持一些驱动,这个可以看官方文档。
使用monolog
支持的保存日志至Elasticsearch
:
'elasticsearch' => ['driver' => 'monolog','handler' => Monolog\Handler\ElasticsearchHandler::class,'formatter' => Monolog\Formatter\ElasticsearchFormatter::class,'handler_with' => ['host' => env('ELASTICSEARCH_HOST', 'localhost:9200'), // Elasticsearch 服务器地址'index' => 'laravel_logs', // Elasticsearch 索引名],'formatter_with' => ['application_name' => env('APP_NAME', 'Laravel'),'environment' => env('APP_ENV', 'production'),'server' => gethostname(),],],#【重要】关于上面ES的配置,并不一定和我上面的一致,因为ES版本不同要求的配置方式也不同,还需自己看当前版本的源码。
默认日志是同步的
Laravel 支持的日志默认是同步执行的,如果想要实现异步可以利用 slack 或monolog 的其它支持、还可以基于它们自定义实现一下。
!完,你还想了解什么请留言讨论。
W+WPguiAgzFdKGh0dHBzOi8vYmxvZy5jc2RuLm5ldC93ZWl4aW5fNDQwMjY5NjIvYXJ0aWNsZS9kZXRhaWxzLzEzNTM4MjQzMCkKW+WPguiAgzJdKGh0dHBzOi8vYmxvZy5jc2RuLm5ldC9zYW5iaW5neXV0dW9uaWFvMTIzL2FydGljbGUvZGV0YWlscy83MTEyNTMwNCkKW+a6kOeggeWIhuaekF0oaHR0cHM6Ly96aHVhbmxhbi56aGlodS5jb20vcC82NzYzMDA4MTEp