Laravel 日志系统是怎么处理的?
Posted PHP在线中心
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Laravel 日志系统是怎么处理的?相关的知识,希望对你有一定的参考价值。
日志系统 简介
配置
config/logging.php
配置文件中。这个文件允许你配置你的应用程序日志通道,所以务必查看每个可用的通道及它们的选项。当然,我们将在下面回顾一些常用的选项。
stack
去记录日志消息。stack 通道被用来将多个日志通道聚合到一个单一的通道中。关于堆栈的更多信息,查看 以下文档。
配置通道名称
production
或者
local
。要改变这个值,需添加一个
name
选项到你的通道配置中:
'stack' => [
'driver' => 'stack',
'name' => 'channel-name',
'channels' => ['single', 'slack'],
],
可用的通道驱动
stack
|
|
single
|
StreamHandler
)
|
daily
|
RotatingFileHandler
|
slack
|
SlackWebhookHandler
|
papertrail
|
SyslogUdpHandler
|
syslog
|
SyslogHandler
|
errorlog
|
ErrorLogHandler
|
monolog
|
|
custom
|
|
Tip:有关 monolog
和custom
驱动,查看 高级通道自定义
配置 Single 和 Daily 通道
single
和
daily
通道包含三个可选配置项:
bubble
、
permission
和
locking
.
bubble
|
|
true
|
permission
|
|
0644
|
locking
|
|
false
|
配置 Papertrail 通道
papertrail
通道需要
url
和
端口
配置选项。你可一从这里获取这些值 Papertrail 。
配置 Slack 通道
slack
通道需要
url
配置选项。这个 URL 应当与你为 Slack 团队配置的一个 incoming webhook 相匹配。
构建日志堆栈
stack
驱动允许你在单一日志通道中整合多个通道。让我们通过一个产品级应用的配置实例来看看如果使用日志堆栈:
'channels' => [
'stack' => [
'driver' => 'stack',
'channels' => ['syslog', 'slack'],
],
'syslog' => [
'driver' => 'syslog',
'level' => 'debug',
],
'slack' => [
'driver' => 'slack',
'url' => env('LOG_SLACK_WEBHOOK_URL'),
'username' => 'Laravel Log',
'emoji' => ':boom:',
'level' => 'critical',
],
],
stack
通过借助它的
channels
选项聚合了另外两个通道:
syslog
和
slack
。因此,在记录日志消息时,这两个通道都有机会完成日志消息记录:
日志级别
syslog
和
slack
中存在的
level
配置项。这个选项决定了需要被该通道记录的日志的最低 「级别」。Monolog (一个功能强劲的 Laravel 日志服务)接受定义在 RFC 5424 specification 中的全部级别: emergency、alert、 critical、 error、 warning、 notice、 info 和 debug。
debug
方法记录日志消息:
Log::debug('An informational message.');
syslog
通道将把该消息记录到系统日志;不过因为错误消息不是
critical
或更高级别,它将不会被发送到 Slack。如果我们记录一条
emergency
消息,它将被发送给系统日志和 Slack,因为
emergency
的级别高于两个通道的最低级别限制:
Log::emergency('The system is down!');
写日志消息
Log
facade 将信息写入日志。如前所述,日志提供定义在 RFC 5424 specification 中的可用日志级别: emergency、 alert、 critical、 error、 warning、 notice、 info 和 debug:
Log::emergency($message);
Log::alert($message);
Log::critical($message);
Log::error($message);
Log::warning($message);
Log::notice($message);
Log::info($message);
Log::debug($message);
config/logging.php
配置文件中定义的默认日志通道:
<?php
namespace App\Http\Controllers;
use App\User;
use Illuminate\Support\Facades\Log;
use App\Http\Controllers\Controller;
class UserController extends Controller
{
/**
* 显示给定用户的配置信息。
*
* @param int $id
* @return Response
*/
public function showProfile($id)
{
Log::info('Showing user profile for user: '.$id);
return view('user.profile', ['user' => User::findOrFail($id)]);
}
}
上下文信息
Log::info('User failed to login.', ['id' => $user->id]);
写入指定通道
Log
facade 的
channel
方法获取定义在配置文件中的任一通道并将消息写入其中 :
Log::channel('slack')->info('Something happened!');
stack
方法:
Log::stack(['single', 'slack'])->info('Something happened!');
高度自定义 Monolog 通道
为通道自定义 Monolog
FormatterInterface
实现:
tap
数组。
tap
数组包含一个在通道创建后有机会用于自定义 Monolog 实例的类列表:
'single' => [
'driver' => 'single',
'tap' => [App\Logging\CustomizeFormatter::class],
'path' => storage_path('logs/laravel.log'),
'level' => 'debug',
],
tap
选项配置,就要准备用于自定义 Monolog 实例的类。这种类这需要一个方法:
__invoke
,它接受一个
Illuminate\Log\Logger
实例作为其参数。
Illuminate\Log\Logger
实例将所有方法调用代理到基础的 Monolog 实例:
<?php
namespace App\Logging;
class CustomizeFormatter
{
/**
* 自定义给定的日志实例。
*
* @param \Illuminate\Log\Logger $logger
* @return void
*/
public function __invoke($logger)
{
foreach ($logger->getHandlers() as $handler) {
$handler->setFormatter(...);
}
}
}
Tip:所有的 "tap" 类都是由 服务容器 解析的,因此任何依赖它们的构造器都会自动被注入。
创建 Monolog 处理器通道
monolog
驱动创建。
monolog
驱动时,
handler
配置项用于指定被实例化的处理器。如果该处理器的构造器需要参数,可以使用可选的
with
配置项来指定:
'logentries' => [
'driver' => 'monolog',
'handler' => Monolog\Handler\SyslogUdpHandler::class,
'with' => [
'host' => 'my.logentries.internal.datahubhost.company.com',
'port' => '10000',
],
],
Monolog 格式化
monolog
驱动时,Monolog 的
LineFormatter
用于默认的格式化处理器。当然,你也可以使用
formatter
and
formatter_with
配置项自定义格式化处理器类型:
'browser' => [
'driver' => 'monolog',
'handler' => Monolog\Handler\BrowserConsoleHandler::class,
'formatter' => Monolog\Formatter\htmlFormatter::class,
'formatter_with' => [
'dateFormat' => 'Y-m-d',
],
],
formatter
配置项指定为
default
:
'newrelic' => [
'driver' => 'monolog',
'handler' => Monolog\Handler\NewRelicHandler::class,
'formatter' => 'default',
],
通过工厂创建渠道
config/logging.php
配置文件中指定
custom
驱动程序类型。 你的配置应该包含一个
via
选项,指向将被调用以创建 Monolog 实例的工厂类:
'channels' => [
'custom' => [
'driver' => 'custom',
'via' => App\Logging\CreateCustomLogger::class,
],
],
custom
通道,就可以定义创建 Monolog 实例的类。 这个类只需要一个方法:
__invoke
,它就可以返回 Monolog 实例:
<?php
namespace App\Logging;
use Monolog\Logger;
class CreateCustomLogger{
/**
* 创建一个 Monolog 实例.
*
* @param array $config
* @return \Monolog\Logger
*/
public function __invoke(array $config) {
return new Logger(...);
}
}
以上是关于Laravel 日志系统是怎么处理的?的主要内容,如果未能解决你的问题,请参考以下文章
我的Android进阶之旅NDK开发之在C++代码中使用Android Log打印日志,打印出C++的函数耗时以及代码片段耗时详情