如何在Symfony config.yml中使用自定义HandlerWrapper for Monolog?

时间:2016-10-24 12:28:59

标签: php symfony monolog

我想创建一个自定义Monolog,以便在我的Symfony 2.8项目中与CustomHandler一起使用。

目标是使用此Monolog\Handler\HandlerWrapper作为过滤器,决定是否调用包装/嵌套处理程序。

==============

更新:由于@Yonel的回答,以下问题已经解决。然而,这带来了下面描述的新问题。

扩展config_prod.yml当然不是问题。但是我在namespace AppBundle\Log; use Monolog\Handler\HandlerWrapper; class CustomHandler extends HandlerWrapper { public function handle(array $record) { // some custom handling/processing... if ($this->doSomeCheck()) return $this->handler->handle($record); else return false; // Do not call nested handler } }

中的Monolog配置中苦苦寻求自定义类
services:
    monolog.custom_handler.service:
        class: AppBundle\Log\CustomHandler

monolog:
    main:
        type: service
        id: monolog.custom_handler.service            
        level: error 
        handler: someHandler
    someHandler:
        ...

配置:

app/console cache:warmup

问题:在此配置上运行monolog.custom_handler.service时,出现以下错误:

  

[Symfony的\元器件\调试\异常\ ContextErrorException]
  可捕获的致命错误:参数1传递给   Monolog \ Handler \ GroupHandler :: __ construct()必须是类型数组,   没有给出

嗯,我认为问题的根源很明显:someHandler的服务定义不会将任何参数传递给类。但是如何将someHandler作为参数传递,如Monolog配置中所定义的那样?

==============

编辑:新问题

正如Yonel在回答中所述,on可以使用以下配置将custom_handler传递给services: monolog.custom_handler.service: class: AppBundle\Log\CustomHandler arguments: - '@monolog.handler.testHandler' monolog.test_handler.service: class: AppBundle\Log\TestHandler monolog: # Skip level checking (can be solved by adding a FingersCrossed handler) main: type: service id: monolog.custom_handler.service testHandler: type: service id: monolog.test_handler.service nested: true

TestHandler

此作品:CustomHandler现已正确传递到CustomHandler

然而,目标是让TestHandler决定,是否调用了TestHandler。这不适用于此配置:无论如何都会调用TestHandler(我假设直接由Monolog,与任何其他处理程序一样)。如果CustomHandler传递给nested,标记为CustomHandler,则无效。

我将HandlerWrapper实施为TestHandler,将AbstractHandler实施为handle。在调用TestHandler方法时,这两个类都直接指向日志文件(不使用Monolog)。这样我可以检查处理程序是否按预期工作(CustomHandler只应在TestHandler允许的情况下调用)。 情况并非如此。

无论CustomHandler是否传递给nested,如果标记为CustomHandler,如果handleTestHandler方法中返回true或false,等等,结果始终相同:无论CustomHandler决定什么,都会调用namespace AppBundle\Log; use Monolog\Handler\HandlerWrapper; class CustomHandler extends HandlerWrapper { public function handle(array $record) { // some custom handling/processing... if ($this->doSomeCheck()) { $this->directlyWriteToFileNotUsingMonolog('CustomHandler: Call TestHandler'); return $this->handler->handle($record); else { $this->directlyWriteToFileNotUsingMonolog('CustomHandler: Do NOT call TestHandler'); return false; // Do not call nested handler } } class TestHandler extends AbstractHandler { public function handle(array $record) { $this->directlyWriteToFileNotUsingMonolog('TestHandler'); return false; } }

如何解决这个问题?

处理程序实现:

df.where($"type".==="type1" && $"status"==="completed").

0 个答案:

没有答案