如何覆盖Laravel / Monolog异常的格式?
现在他们像这样出来了:
Next exception 'Illuminate\Database\QueryException' with message 'SQLSTATE[42S22]: Column not found: 1054 Unknown column 'pay.booking_id' in 'where clause' (SQL: select `seg`.`id` as `segment_id`, ..*snip*.. in /srv/myproject/vendor/laravel/framework/src/Illuminate/Database/Connection.php:729
Stack trace:
#0 /srv/myproject/vendor/laravel/framework/src/Illuminate/Database/Connection.php(685): Illuminate\Database\Connection->runQueryCallback('select `seg`.`i...', Array, Object(Closure))
#1 /srv/myproject/vendor/laravel/framework/src/Illuminate/Database/Connection.php(349): Illuminate\Database\Connection->run('select `seg`.`i...', Array, Object(Closure))
#2 /srv/myproject/vendor/laravel/framework/src/Illuminate/Database/Query/Builder.php(1610): Illuminate\Database\Connection->select('select `seg`.`i...', Array, true)
#3 /srv/myproject/vendor/laravel/framework/src/Illuminate/Database/Query/Builder.php(1596): Illuminate\Database\Query\Builder->runSelect()
我想获取Exception对象并自己格式化(返回字符串)。我不想覆盖/重新实现日志的位置(什么文件)或任何类似性质的东西。
使用Laravel 5.2。
答案 0 :(得分:2)
我不确定这是否是您要寻找的,但是您可以扩展LogManager类,并用您自己的格式器替换。
我创建了一个新的LogManager
,如下所示:
<?php
namespace App\Support\Log;
use Illuminate\Log\LogManager as BaseLogManager;
use Monolog\Formatter\LineFormatter;
class LogManager extends BaseLogManager
{
protected function formatter()
{
$format = "%channel%.%level_name%: %message% %context% %extra% [%datetime%]\n";
return tap(new LineFormatter($format, null, true, true), function ($formatter) {
$formatter->includeStacktraces();
});
}
}
..扩展了Laravel的基本日志管理器,但带有覆盖的formatter()
。
您还将注意到消息的格式已更改,由此日期被附加到字符串的最后一部分。
唯一要做的就是将其绑定到容器中,而不是默认容器中。因此,我在AppServiceProvider@register()
中添加了以下内容:
use App\Support\Log\LogManager;
$this->app->singleton('log', function () {
return new LogManager($this->app);
});
..当然,新的日志格式如下:
local.INFO: test [2019-01-14 04:42:07]
您还可以查看LineFormatter class,并查看可以使用它进行哪些其他操作。
这是您要找的东西吗?