Laravel 记录事件
Laravel Log Events
Laravel 5.1 是否广播任何您可以收听的日志记录事件?例如,如果创建了一个日志条目并将其保存到日志文件中,它是否提供了将要插入到日志中的信息?我找不到关于该主题的任何信息,所以任何帮助都会很好,谢谢!
编辑:
通过 Laravel 日志编写器源进行了搜索。发现所有名为 illuminate.log
的日志事件都会触发一个事件,然后由作者捕获。
https://github.com/laravel/framework/blob/5.1/src/Illuminate/Log/Writer.php#L295
当抛出异常时,会创建一个日志条目,但是当发生这种情况时似乎没有调度事件。只有当您显式调用日志时,事件才会被调度。例如,它的输出是 Log was written to
:
Route::get('/', function () {
Event::listen('illuminate.log', function()
{
die('Log was written to');
});
Log::info('info');
throw new Exception('Exception');
});
然而,这只是显示异常:
Route::get('/', function () {
Event::listen('illuminate.log', function()
{
die('Log was written to');
});
throw new Exception('Exception');
});
我不确定这是否是一个错误?我猜不会,如果是这样的话,有人对此有任何建议吗?我只需要在写入日志时捕捉并保存信息。
通过 laravel 日志编写器添加 monolog 处理程序最终成为这里的方法。我用以下内容创建了一个 LoggerServiceProvider
:
namespace App\Providers;
use Monolog\Logger;
use Illuminate\Log\Writer;
use Illuminate\Support\ServiceProvider;
class LoggerServiceProvider extends ServiceProvider
{
/**
* Push the eloquent handler to monolog on boot.
*/
public function boot()
{
$logger = app('log');
// Make sure the logger is a Writer instance
if($logger instanceof Writer) {
$monolog = $logger->getMonolog();
// Make sure the Monolog Logger is returned
if($monolog instanceof Logger) {
// Create your custom handler
$handler = new App\Handlers\MyCustomHandler();
// Push it to monolog
$monolog->pushHandler($handler);
}
}
}
/**
* Register bindings in the container.
*/
public function register()
{
//
}
}
我建议像这样扩展 Monologs AbstractHandler
:
namespace App\Handlers\MyCustomHandler;
use Monolog\Handler\AbstractHandler;
class MyCustomHandler extends AbstractHandler
{
/**
* Handle the log record.
*
* @param array $record
*
* @return bool
*/
public function handle(array $record = [])
{
// Do something with the $record array
}
}
然后在您的 config/app.php
文件中插入您的新服务提供商。
如果异常没有处理这个,那么我建议将记录器子类化,并覆盖 writeLog
方法来处理所有日志操作,然后 parent::writeLog()
保持日志记录.
然后在应用程序容器中使用 log
、Psr\Log\LoggerInterface
和 Illuminate\Contracts\Logging\Log
键进行注册。
Laravel 5.1 是否广播任何您可以收听的日志记录事件?例如,如果创建了一个日志条目并将其保存到日志文件中,它是否提供了将要插入到日志中的信息?我找不到关于该主题的任何信息,所以任何帮助都会很好,谢谢!
编辑:
通过 Laravel 日志编写器源进行了搜索。发现所有名为 illuminate.log
的日志事件都会触发一个事件,然后由作者捕获。
https://github.com/laravel/framework/blob/5.1/src/Illuminate/Log/Writer.php#L295
当抛出异常时,会创建一个日志条目,但是当发生这种情况时似乎没有调度事件。只有当您显式调用日志时,事件才会被调度。例如,它的输出是 Log was written to
:
Route::get('/', function () {
Event::listen('illuminate.log', function()
{
die('Log was written to');
});
Log::info('info');
throw new Exception('Exception');
});
然而,这只是显示异常:
Route::get('/', function () {
Event::listen('illuminate.log', function()
{
die('Log was written to');
});
throw new Exception('Exception');
});
我不确定这是否是一个错误?我猜不会,如果是这样的话,有人对此有任何建议吗?我只需要在写入日志时捕捉并保存信息。
通过 laravel 日志编写器添加 monolog 处理程序最终成为这里的方法。我用以下内容创建了一个 LoggerServiceProvider
:
namespace App\Providers;
use Monolog\Logger;
use Illuminate\Log\Writer;
use Illuminate\Support\ServiceProvider;
class LoggerServiceProvider extends ServiceProvider
{
/**
* Push the eloquent handler to monolog on boot.
*/
public function boot()
{
$logger = app('log');
// Make sure the logger is a Writer instance
if($logger instanceof Writer) {
$monolog = $logger->getMonolog();
// Make sure the Monolog Logger is returned
if($monolog instanceof Logger) {
// Create your custom handler
$handler = new App\Handlers\MyCustomHandler();
// Push it to monolog
$monolog->pushHandler($handler);
}
}
}
/**
* Register bindings in the container.
*/
public function register()
{
//
}
}
我建议像这样扩展 Monologs AbstractHandler
:
namespace App\Handlers\MyCustomHandler;
use Monolog\Handler\AbstractHandler;
class MyCustomHandler extends AbstractHandler
{
/**
* Handle the log record.
*
* @param array $record
*
* @return bool
*/
public function handle(array $record = [])
{
// Do something with the $record array
}
}
然后在您的 config/app.php
文件中插入您的新服务提供商。
如果异常没有处理这个,那么我建议将记录器子类化,并覆盖 writeLog
方法来处理所有日志操作,然后 parent::writeLog()
保持日志记录.
然后在应用程序容器中使用 log
、Psr\Log\LoggerInterface
和 Illuminate\Contracts\Logging\Log
键进行注册。