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.");
}
目录结构:
LogServiceProvider 开启了延迟加载,在 register 方法中注册了两个对象:
Monolog
先介绍错误的 8 个层级,层级越高,表示问题越严重、越紧急:
Laravel 使用 Monolog 库处理日志,它实现了这个 8 个层级对应的方法,如下:
为了兼容 Psr\Log\LoggerInterface 的接口,Monolog 还提供了以下方法,作用和上面这些是一模一样的:
Writter 类内部使用的是 $logger->addXXX 系列,但是对外提供的接口却又是没 add 前缀的,个人觉得这里统一成一套会比较好理解。
Writer 类没有显式的定义这 8 个方法,而是通过 __call 魔术方法实现,如下:
首先格式化参数,确保第一个参数是字符串类型。如果不是,尽可能的转为字符串,比如是数组就用 var_export($arr, true),实现了 JsonableInterface 接口就用 toJson() 等。
然后触发事件,事件名为 "illuminate.log"。
最后调用 Monolog 的 addXXX 系列方法完成核心功能。
日志文件
Writer 类提供了三种日志文件: