Service
<?php namespace App\Master\Services;
use Monolog\Logger;
use Monolog\Handler\StreamHandler;
use Illuminate\Log\Writer;
class BLogger
{
private static $loggers = array();
// 获取一个实例
public static function getLogger($type, $day = 30)
{
if (empty(self::$loggers[$type])) {
self::$loggers[$type] = new Writer(new Logger($type));
self::$loggers[$type]->useDailyFiles(storage_path().'/logs/'. $type .'.log', $day);
}
$log = self::$loggers[$type];
return $log;
}
/**
* 做错误纪录,可以在任何地方调用这个纪录错误信息
* @param Exception $exception 异常
* @return null
*/
public static function logError($exception, $type = self::LOG_ERROR)
{
$logger = self::getLogger($type);
$err = [
'message' => $exception->getMessage(),
'file' => $exception->getFile(),
'line' => $exception->getLine(),
'code' => $exception->getCode(),
'url' => \Request::url(),
'input' => \Input::all(),
];
BLogger::getLogger("error")->error($err);
}
}
Controller
BLogger::getLogger('aaa')->error([1=> 1]);
最终生成的日志名:
-rw-rw-r-- 1 weihaoyu weihaoyu 55 10月 17 13:32 aaa-2019-10-17.log
日志记录:
[2019-10-17 13:32:21] aaa.ERROR: array (
1 => 1,
)
其中核心概念和操作顺序(上面代码中省略掉了2-4步,只做了最简单的磁盘写入):
1、new Logger($channel)//一般channel用模块和控制器文件名命名
2、Hander:使用多个handler,先入后出,通过bubble参数控制是否继续冒泡,false在当前handler处理停止冒泡,true继续冒泡
3、Processor:为日志记录添加额外信息
4、Formatter:把日志记录格式化成指定格式
5、使用laravel中的 Illuminate\Log\Writer 写入磁盘,其他框架用对应的类或者自己写
参考:
https://github.com/Seldaek/monolog
https://blog.csdn.net/sanbingyutuoniao123/article/details/71079534