扩展 Laravel 核心日志记录

2024-01-22

我回来时遇到了更多 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。

然而,当我尝试运行时,我收到以下错误。

调用未定义的方法 Illuminate\Support\Facades\Log::useDailyFiles()

我不明白为什么会发生这种情况。我已经删除了核心 LogServiceProvider,我在它的位置添加了我自己的 LogServiceProvider 并根据文档正确绑定了它(我认为)。我在这里做错了什么?


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

替换 Laravel 的日志

您可能想使用register https://github.com/laravel/framework/blob/4.0/src/Illuminate/Log/LogServiceProvider.php#L20方法而不是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 {}

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

A con这个设置的原因是我没有创建或覆盖Log外观使用我的新记录器。任何电话至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');
    }

}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

扩展 Laravel 核心日志记录 的相关文章

  • 如何从命令行执行 PHP 代码?

    我想执行单个 PHP 语句 例如if function exists my func echo function exists 直接使用命令行 无需使用单独的 PHP 文件 这怎么可能 如果您要在命令行中执行 PHP 我建议您安装phpsh
  • 加载视图 - codeigniter 错误

    我是 codeigniter 的新手 我正在做一个菜单 所以我将所有链接不放在同一个主文件中 以免一直重复 我的代码是 在main php中 main agregar gt Agregar span a href Modificar a s
  • $_POST 最大数组大小

    我有一个非常大的表单 有 gt 1000 个元素 它们已经嵌套在表单 html 结构中 foreach from result item item tr td td tr
  • Laravel 内存问题?

    各位 我在 DO 服务器上遇到这样的问题 我已经尝试了一切 整个网站在使用 Homestead 的 Linux 服务器上 100 正常工作 但上传后 它只能工作一次 在重新加载或刷新页面后会多次下降 我尝试增加 apache 服务器的内存
  • yii2 更新后返回上一页

    更新记录后如何将用户重定向到上一页 这是典型的场景 用户在索引页面中过滤结果或对记录进行分页 然后找到想要编辑的记录并单击编辑按钮 他们更新该记录的数据 一旦单击 更新 按钮 他们将被重定向到索引视图 但具有先前选择的过滤器 页面 更新后我
  • PHP 添加 1 个月至今

    我有一个返回 1 个月前的 url 的函数 我想显示当前选定的月份 但我不能使用简单的当前月份 因为当用户单击 1 个月前的链接时 选定的月份将发生变化并且不是当前月份 因此 函数返回 August 2012 如何制作可以增加 1 个月时间
  • 选择 mysql 枚举的 php 函数

    因此 我创建了一个函数 它将从数据库中的枚举字段中提取值
  • PHP 内部:TSRMLS_FETCH 如何工作?

    PHP 内部结构是怎样的TSRMLS FETCH宏发挥作用吗 Per the PHP手册 http php net manual en internals2 memory tsrm php 在开发扩展时 包含 tsrm ls is unde
  • 为什么 crontab 不执行我的 PHP 脚本?

    我已经构建了一个 php 文件来检查一些结果 因此我需要设置一个 cronjob 我设置每 30 分钟运行一次 以便发送结果 但是 我不知道为什么我的 crontab 没有每 30 分钟运行一次 这是我设置 crontab 的方法 30 p
  • 如何让 CodeIgniter 接受“查询字符串”URL?

    根据 CI 的文档 CodeIgniter 使用基于分段的方法 例如 example com my group 如果我想找到一个特定的组 id 5 我可以访问 example com my group 5 并在控制器中定义 function
  • Composer 安装失败并出现总线错误:10

    我正在尝试安装作曲家 curl sS https getcomposer org installer php 此操作失败并显示错误消息 Bus error 10 我也尝试过 php r readfile https getcomposer
  • php脚本阻止直接访问

    我正在使用 ajax 从 php 脚本 例如 cost php 获取值 并且我知道直接访问它并获取该值会很容易 我什至在同一个脚本 cost php 上运行 cron 作业 所以如果我使用以下命令 cron 作业将无法工作 if empty
  • 更改 Symfony2 中的默认语言环境

    我正在尝试更改应用程序的默认区域设置 到目前为止我尝试过的事情 将 intl default locale 设置为 et EE 将区域设置设置为 et app config parameters ini 更改了我的捆绑包 boot 方法中描
  • 如何使用 MySQL 和 PHP 在数据库中存储标签?

    我想创建一个数据库来存储用户为其问题输入的标签 然后为发布的每个单独问题显示所有标签 像这里这样的东西 这是现在为我做所有事情的表 CREATE TABLE questions tags id INT UNSIGNED NOT NULL A
  • 如何从页面获取所有网址(php)

    我有一个页面 其中的网址和描述逐一列出 例如书签 网站列表 如何使用php从该页面获取所有url并将它们写入txt文件 每行一个 只有url而没有描述 页面如下所示 一些描述 http link com 其他说明 http link2 co
  • 证明字符串算法[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • xampp openssl 调用 openssl_pkey_new() 时出错;

    所以我试图让 openssl 在我的 Windows 安装的 xampp 1 7 3 上工作 它是用 OpenSSL 0 9 8l 构建的 这只是我第二次在 amp 安装上安装 openssl 但第一次进展顺利 这是在同一台机器上的 wam
  • 使用 google 检查 url,安全 = 活动

    如何检查 url 是否被 google 显示 Example https www google com search q redtubex xxx safe active Code input http www example com in
  • 限制传出 PHP+curl 请求的速率

    有没有办法限制 有延迟 向外部服务器发出 PHP curl 请求的速率 以便每秒只有 n 个请求 PHP 在 Fastcgi 模式下使用 因此无法使用睡眠 是的 有curl 多重处理程序 您可以使用 OOP 方式以 OOP 方式完成此操作这
  • 如何开始 Zend Framework 开发

    Hai 首先谢谢 我下载了 Zend 框架 C wamp zend 我将 php ini 的包含路径更改为 C wamp zend 我在我的 php 信息中看到了这个 我认为包含路径是正确的 我仍然有很多疑问 我从哪里开始在 zend 框架

随机推荐

  • Cocoa:我已经收到了用户的输入 - 现在怎么办?

    简而言之 我的程序所做的是 它使用 nswindow 由我的 NSWindowController 对象控制 定期执行并获取用户输入 然后继续执行 这是我的 myController mm 它正在调用并显示窗口以接受用户输入 Encrypt
  • firebase $add() .push() .set()

    我正在使用 firebase 和 Angularfire 使用 Firebase Api 进行 CRUD 的方法有很多种 实际上 我仍然不明白使用的具体区别是什么 add 与 firebaseArray push 方法 set 方法 我认为
  • 如何仅使用分区键从 aws Dynamodb 获取数据?

    我正在使用 aws sdk go 库在 Golang 中进行 DynamoDb 连接 我的 DynamoDb 表有一个分区键 DeviceId 字符串 和一个排序键时间 数字 如何编写 GetItemInput 来获取具有特定 Device
  • Autofac 和 WebAPI - 默认构造函数错误

    我有一个 webforms 项目 但正在使用 WebAPI 来提供 Web 服务 我正在尝试实施 Autofac 我正进入 状态 MyController does not have a default constructor 根据 Aut
  • 利用 IIS 中的浏览器缓存(google pagespeed 问题)

    关于利用浏览器缓存有几个问题 但我没有找到任何关于如何在 ASP NET 应用程序中执行此操作的有用信息 Google 的 Pagespeed 表明这是性能最大的问题 到目前为止 我在我的网络配置
  • 限制每个连接/ip 的 Apache 代理上传速度?

    我查看了 mod bandwidth 和 mod cban 但它们似乎不能满足我的要求 我正在使用 apache 2 2 mod proxy proxy http proxy connect 运行代理服务器 我想限制 客户端的上传速度 这同
  • 如何用Python的ElementTree创建“虚拟根”?

    我正在尝试使用 Python 的 ElementTree 生成 XHTML 文件 但是 ElementTree Element 只允许我创建单个标签 例如 HTML 我需要创建某种虚拟根目录或任何名称 以便我可以将各种 DOCTYPES 等
  • 特定数据库上的 DataAdapter.fill(dataset) 超时异常

    在 VB NET 应用程序 VS2005 中 我通过 SQLDataAdapter 调用存储过程 在我的本地数据库上一切正常 如果我在另一个数据库上执行此操作 则会出现超时异常 这是代码 Public Overloads Shared Fu
  • Mac 允许的最大线程数

    macOS 在报告错误之前允许的最大线程数是多少 我找不到一个简单的答案 我相信是 125 但是我怎样才能找到这个呢 谢谢你的帮助 正如我在评论中所述 这显然取决于 macOS 版本 我不知道确切的限制 但 macOS 肯定会支持每个进程超
  • 如何扩展给定的数字范围以包含由破折号分隔的所有数字

    我正在尝试扩展当前由破折号分隔的数字范围以包含所有数字 好消息是我找到了有助于以下配置的代码 不是我的 宴会厅 1 3 产生 宴会厅 1 宴会厅 2 宴会厅 3 这就是我想要的 问题是 这是以破折号前后没有空格为条件的 目前 宴会厅 1 3
  • Laravel 中的参数错误

    我面临着Invalid parameter number parameter was not defined 是因为这个吗 and orders hour begin gt begin hour and orders hour final
  • 将提供程序注入另一个提供程序

    假设我们有一个名为Comp和两个 Injectable提供者称为P1 and P2 P1需要一个实例P2 P1被注入Comp 如果我声明两个提供商都在 它就可以正常工作Comp像这样 Component providers P1 P2 ex
  • 如何清除 StyledDocument 中的所有样式?

    样式文档 http docs oracle com javase 7 docs api javax swing text StyledDocument html包含各种设置样式的方法 喜欢设置角色属性 http docs oracle co
  • pygame 中有像海龟一样的 .stamp() 方法吗?

    我正在开发一个简单的 pygame 项目 在其中您可以通过按空格来克隆自己 我在 Turtle 中使用以下命令创建了这个项目Turtle stamp 但我不确定pygame中是否存在这样的东西 简短回答 不 没有一个 长答案 但是 您可以轻
  • 如何在 Swift 中加载 UIWebView 中的 URL?

    我有以下代码 UIWebView loadRequest NSURLRequest URL NSURL string google ca 我收到以下错误 NSURLRequest 无法转换为 UIWebView 知道问题是什么吗 加载请求
  • Angular2 - “无法绑定到‘ngSwitchWhen’,因为它不是‘模板’的已知属性。”

    我收到以下错误 无法绑定到 ngSwitchWhen 因为它不是 模板 的已知属性 我读过不同的主题 建议添加 从 angular common 导入 CommonModule 并将 CommonModule 添加到 NgModel的导入部
  • Xcode 8 beta 6 - 架构的冲突值

    我尝试使用 Xcode beta 6 在设备上安装我的应用程序 但它在链接阶段失败并出现以下错误 ld linking module flags Objective C Class Properties IDs have conflicti
  • 应用两个数据框

    我正在使用 R 并且我有两个 data frames A and B 它们都有 6 行 但是A有 25000 个列 基因 并且B有 30 列 我想应用一个带有两个参数的函数f x y where x是每一列A and y是每一列B 到目前为
  • C# 将列表拆分为 n 组的所有组合 - 来自 Python 的代码迁移

    我所追求的算法有一个很好的实现here https stackoverflow com questions 39192777 python split a list into n groups in all possible combina
  • 扩展 Laravel 核心日志记录

    我回来时遇到了更多 Laravel 问题 因为我在理解事物方面遇到了问题 再次 我尝试创建一个包来进行我自己的日志记录 在进行了一些额外的阅读 浏览核心代码并尝试其他方法之后 我得出的结论是 我需要做的就是扩展 laravel 日志记录的核