musicode / test

test
14 stars 1 forks source link

[Laravel 模块] Illuminate\Log #19

Open musicode opened 9 years ago

musicode commented 9 years ago

目录结构:

- composer.json
- LogServiceProvider.php
- Writer.php

LogServiceProvider 开启了延迟加载,在 register 方法中注册了两个对象:

先介绍错误的 8 个层级,层级越高,表示问题越严重、越紧急:

Laravel 使用 Monolog 库处理日志,它实现了这个 8 个层级对应的方法,如下:

$logger->addDebug('message');
$logger->addInfo('message');
$logger->addNotice('message');
$logger->addWarning('message');
$logger->addError('message');
$logger->addCritical('message');
$logger->addAlert('message');
$logger->addEmergency('message');

为了兼容 Psr\Log\LoggerInterface 的接口,Monolog 还提供了以下方法,作用和上面这些是一模一样的:

$logger->debug('message');
$logger->info('message');
$logger->notice('message');
$logger->warning('message');
$logger->error('message');
$logger->critical('message');
$logger->alert('message');
$logger->emergency('message');

Writter 类内部使用的是 $logger->addXXX 系列,但是对外提供的接口却又是没 add 前缀的,个人觉得这里统一成一套会比较好理解。

Writer 类没有显式的定义这 8 个方法,而是通过 __call 魔术方法实现,如下:

public function __call($method, $parameters)
{
    if (in_array($method, $this->levels))
    {
        $this->formatParameters($parameters);
        call_user_func_array(array($this, 'fireLogEvent'), array_merge(array($method), $parameters));
        $method = 'add'.ucfirst($method);
        return $this->callMonolog($method, $parameters);
    }
    throw new \BadMethodCallException("Method [$method] does not exist.");
}

首先格式化参数,确保第一个参数是字符串类型。如果不是,尽可能的转为字符串,比如是数组就用 var_export($arr, true),实现了 JsonableInterface 接口就用 toJson() 等。

然后触发事件,事件名为 "illuminate.log"。

最后调用 Monolog 的 addXXX 系列方法完成核心功能。

日志文件

Writer 类提供了三种日志文件: