使用Monolog在Symfony2中记录PHP致命错误

fde*_*tri 10 symfony monolog

我需要一种方法来捕获PHP致命错误(还有通知和警告)并使用Monolog记录它们.

我发现Monolog 1.6+有ErrorHandler :: register()方法,但我无法弄清楚如何在Symfony2(生产)应用程序中使用它,以及如何在config.yml中正确配置它.

fde*_*tri 11

感谢@jenechka,他指出了我正确的方向,我想我找到了一个解决方案:

services.yml:

    vir.exception.listener:
    class: %vir.exception.listener.class%
    arguments: ["@logger"]
    tags:
        - { name: kernel.event_listener, event: kernel.request, method: onKernelRequest }
Run Code Online (Sandbox Code Playgroud)

错误处理程序:

<?php

namespace Mitecube\VoglioilruoloBundle\Listener;

use Symfony\Component\Debug\ErrorHandler;
use Symfony\Component\HttpKernel\Event\GetResponseEvent;
use Psr\Log\LoggerInterface;

class VoglioilruoloErrorHandler extends ErrorHandler {

    private $logger;
    private $prevErrorHandler;

    public function __construct(LoggerInterface $logger)
    {
        $this->logger = $logger;
        $this->prevErrorHandler = set_error_handler(array($this, 'handle'));
        register_shutdown_function(array($this, 'handleFatal'));
    }

    public function onKernelRequest(GetResponseEvent $event)
    {
    }

    public function handle($level, $message, $file = 'unknown', $line = 0, $context = array())
    {
        $this->logger->error($level . ": " . $message . " - in file " . $file . " - at line " . $line);
        return parent::handle($level, $message, $file, $line, $context);
    }

} 
Run Code Online (Sandbox Code Playgroud)

通过这种方式,我可以将每个错误记录到monolog.我不认为这个解决方案可以被认为是"最佳实践",所以我仍然在寻找更好的解决方案.