gpt4 book ai didi

php - 扩展 Laravel 核心日志记录

转载 作者:可可西里 更新时间:2023-11-01 00:21:30 26 4
gpt4 key购买 nike

我遇到了更多 Laravel 问题,因为我在理解事物时遇到了问题。

我再次尝试创建一个包来进行我自己的日志记录。在做了一些额外的阅读并浏览了核心代码并尝试了其他方法之后,我得出的结论是我需要做的就是扩展 laravel 日志记录的核心功能,以便它记录到不同的路径自定义格式化程序。

我已经创建了我的包。这是我的服务提供商类:

use Illuminate\Log\LogServiceProvider;

class VmlogServiceProvider extends LogServiceProvider {


/**
* Bootstrap the application events.
*
* @return void
*/
public function boot()
{
App::bind('log', function()
{
return new Vm\Vmlog\Vmlog;
});
parent::boot();

}

}

?>

这是 VmLog 类

<?php namespace Vm\Vmlog;

use App;
use Illuminate\Support\ServiceProvider;
use Log;
use Monolog\Formatter\LineFormatter;
use Monolog\Handler\StreamHandler;
use Monolog\Handler\RotatingFileHandler;

class Vmlog extends \Illuminate\Log\Writer {


protected $path;
protected $formatter;
protected $stream;
protected $rotatingStream;

public function __construct() {

$output = APP_HOST."|%datetime%|%level%|%level_name%|".__METHOD__."|%message%|%context%".PHP_EOL;
$this->path = VM_LOGPATH.APP_VLCODE."/".APP_VLCODE."_".APP_INSTANCE.".log";
$this->formatter = new LineFormatter($output, $dateFormat);

parent::__construct();
}

/**
* Register a file log handler.
*
* @param string $path
* @param string $level
* @return void
*/
public function useFiles($path, $level = 'debug')
{
$level = $this->parseLevel($level);

$this->stream = new StreamHandler($this->path, $level);
$this->stream->setFormatter($this->formatter);

$this->monolog->pushHandler($this->stream);
}

/**
* Register a daily file log handler.
*
* @param string $path
* @param int $days
* @param string $level
* @return void
*/
public function useDailyFiles($path, $days = 0, $level = 'debug')
{
$level = $this->parseLevel($level);
$this->rotatingStream = new RotatingFileHandler($this->path, $days, $level);
$this->rotatingStream->setFormatter($this->formatter);

$this->monolog->pushHandler($this->rotatingStream);
}

}

?>

我已经在 app.php 中注释掉了 LogServiceProvider,并在我的 VmlogServiceProvider 中添加了它。

然而,当我尝试运行时,出现以下错误。

Call to undefined method Illuminate\Support\Facades\Log::useDailyFiles()

我不明白为什么会这样。我已经删除了核心 LogServiceProvider,我已经在它的位置添加了我自己的并正确绑定(bind)它,按照文档(我认为)。我在这里做错了什么?

最佳答案

为什么要在服务提供者中使用 Boot 方法?

替换 Laravel 的日志

您可能打算使用 register方法而不是该服务提供商中的 boot 方法?

看起来您的实现将覆盖默认记录器,而不是创建额外的日志。那是你的意图吗?在这种情况下,请注意您已经使用 boot 方法注册了一个“log”实例,但是 register 方法正在重新执行该工作。 (也许用默认值替换它?我不确定会导致什么行为)。

附加日志

如果你想添加一个额外的日志,你可以在不需要扩展 Laravel 的服务提供者的情况下做到这一点。

在一个新文件和您自己的命名空间中,创建一个 LogServiceProvider:

<?php namespace Fideloper\Log;

use Illuminate\Support\ServiceProvider;

class LogServiceProvider extends ServiceProvider {

/**
* Indicates if loading of the provider is deferred.
*
* @var bool
*/
protected $defer = false;

/**
* Register the service provider.
*
* @return void
*/
public function register()
{
$logger = new Writer(new \Monolog\Logger('my-custom-log'), $this->app['events']);

$logFile = 'my-custom-log.txt';

$logger->useDailyFiles(storage_path().'/logs/'.$logFile);

$this->app->instance('fideloper.log', $logger);

$this->app->bind('Fideloper\Log\Writer', function($app)
{
return $app->make('fideloper.log');
});
}

/**
* Get the services provided by the provider.
*
* @return array
*/
public function provides()
{
return array('fideloper.log');
}

}

然后创建一个新的日志写入器(类似于您所做的):

<?php namespace Fideloper\Log;

use Illuminate\Log\Writer as BaseWriter;

class Writer extends BaseWriter {}

请注意,我没有向我的扩展编写器类添加任何额外功能,但我可以。

此设置的一个缺点是我没有创建或覆盖Log facade 来使用我的新记录器。对 Log::whatever() 的任何调用仍将转到 Laravel 的默认值。我创建了一个新的 Fideloper\Log\Writer 对象,由于 Laravel 能够自动提供类依赖项,它可以正常工作。

$log = App::make('fideloper.log');

// Or get auto-created by laravel by making it a dependency
// in a controller, for example:
<?php

use Fideloper\Log\Writer

class SomeController extends BaseController {

public function __construct(Writer $log)
{
$this->log = $log;

//Later
$this->log->error('SOME CUSTOM ERROR');
}

}

关于php - 扩展 Laravel 核心日志记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20519960/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com