我想创建一个自定义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
}
}
:
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
,如果handle
在TestHandler
方法中返回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").