Laravel 大将之 日志 模块

原文

简介

Laravel的日志模块位于Illuminate/Log文件夹下;通过封装Monolog插件提供日志服务;

官方 API 地址 https://laravel.com/api/5.4/Illuminate/Log.html

配置

配置文件
在config/app.php文件中关于日志模块的配置项有两个,分别如下:

 // 日志模式,可选择参数有 "single", "daily", "syslog", "errorlog"
'log' => env('APP_LOG', 'single'),
 // 错误等级,为 "RFC 5424" 中定义的八种日志级
'log_level' => env('APP_LOG_LEVEL', 'debug'),

日志模式不同的参数值有不同的含义:
single 所有日志信息都会输出到storage/log/laravel.log文件中
daily 每天的日志信息都会输出到storage/log文件夹下的日志文件中,日志文件名会包含当天的年月日信息;
syslog 日志信息输出到系统的日志文件中;比如,笔者是centos系统,日志信息写到了/var/log/message文件中
errorlog 相当于调用PHP的error_log语句,没有写入到文件
八种日志错误等级分别为:

错误等级描述整型值应用场景
debug代码引用为 “MonologLogger::DEBUG”100紧急,如系统挂掉
info代码引用为 “MonologLogger::INFO”200需要立即采取行动,如数据库异常等
notice代码引用为 “MonologLogger::NOTICE”250严重问题,如异常
warning代码引用为 “MonologLogger::WARNING”300运行时错误,不需要立即处理但需要被记录和监控
error代码引用为 “MonologLogger::ERROR”400警告但不是错误,比如使用了被废弃的API
critical代码引用为 “MonologLogger::CRITICAL”500普通但值得注意的事件
alert代码引用为 “MonologLogger::ALERT”550感兴趣的事件,比如登录、退出
emergency代码引用为 “MonologLogger::EMERGENCY”600详细的调试信息

如果log_level的值为critical, 则日志只会输出alert和emergency这两种错误等级的信息;

自定义配置

如果你想要在应用中完全控制Monolog的配置,可以使用应用的configureMonologUsing方法;
在bootstrap/app.php文件返回$app变量之前调用该方法;
比如,使用daily日志模式,但日志文件名想自定义,可以如下:

$app->configureMonologUsing(function(Monolog\Logger $log) {
    $filename = storage_path('/logs/' . php_sapi_name() . '.log');
    $handler = new Monolog\Handler\RotatingFileHandler($filename, 0, \Monolog\Logger::DEBUG, true, 0664);
    $handler->setFormatter(new \Monolog\Formatter\LineFormatter(null, null, true, true));  
    $log->pushHandler($handler);                                                                    
});

使用

日志记录
创建日志器实例

直接创建Writer实例,日志器实例还需要设置日志模式与错误等级;

$writer = new Illuminate\Log\Writer(new Monolog\Logger('channel_name'));
$writer->useErrorLog('info');

或者通过全局帮助函数,从服务容器获取实例;日志模式与错误等级已按照配置文件中的参数设置好了;

$writer = app('log');

还有一种直接通过门面模式\Log;比如要输出debug级信息,执行\Log::debug(‘xxxx’);

输出各种类型信息

$writer->emergency('消息内容', ['上下文环境,比如用户ID' => '这里显示用户ID的值,比如78']);
$writer->alert('消息内容');
$writer->critical('消息内容');
$writer->error('消息内容');
$writer->warning('消息内容');
$writer->notice('消息内容');
$writer->info('消息内容');
$writer->debug('消息内容');

$writer->log('emergency', '消息内容'['上下文' => '环境']);
$writer->log('alert', '消息内容'['上下文' => '环境']);

通过app\loginfo.php 配置文件设置(5.4以上才可以)
例如: 怎讲debug 日志

<?php
use Monolog\Handler\NullHandler;
use Monolog\Handler\StreamHandler;
use Monolog\Handler\SyslogUdpHandler;
return [
    'default' => env('LOG_CHANNEL', 'stack'),
    'channels' => [
        'debug' => [
            'driver' => 'daily',
            'path' => storage_path('logs/debug/debug.log'),
            'level' => 'debug',
            'days' => 14,
        ],
    ],
];

php artisan clear::config
调用

Log::channel('debug')->info('aaaaaa');

直接指定日志目录

Log::useFiles(storage_path('logs/job/error.log')); 
Log::info(['message: ' => $e->getMessage()]);

事件监听
每次执行日志输出信息时,如果日志器包含事件分发器(即event dispatcher),则会触发\Illuminate\Log\Events\MessageLogged::class这个事件;

\Illuminate\Log\Events\MessageLogged::class这个事件的构造函数如下:

public function __construct($level, $message, array $context = []) {
    $this->level = $level;
    $this->message = $message; 
    $this->context = $context;
}

首先如何为日志器设置事件分发器,有两处,第一处是构造函数的第二个参数,可以传入事件分发器实例;第二处是通过调用setEventDispatcher方法;Laravel在服务容器注册绑定的日志器,带有事件分发器;

现在,需要为日志写入事件安排一些监听器,通过调用listen方法,比如:

$dispatcher = $writer->getEventDispatcher();
$dispatcher->listen(\Illuminate\Log\Events\MessageLogged::class, function ($event) {
        // 监听器的内容
});

清除日志

将一个空字符串回送到它上面是可行的,如下所示:

echo "" > storage/logs/laravel.log

most efficient的大小为0:

truncate -s 0 /app/storage/logs/laravel.log
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值