问题
I'm working on a Symfony 2.8.6 application and I tried to configure my Monolog as described here and here. This is my Monolog config (bundle version 2.11.1):
monolog:
handlers:
main_critical:
type: fingers_crossed
action_level: error
handler: grouped
channels: ["!doctrine", "!event", "!php"]
excluded_404s:
- ^/
grouped:
type: group
members: [streamed, crash, buffered]
streamed:
type: rotating_file
max_files: 10
path: "%kernel.logs_dir%/%kernel.environment%.log"
level: notice
crash:
type: rotating_file
max_files: 10
path: "%kernel.logs_dir%/%kernel.environment%.critical.log"
level: critical
buffered:
type: buffer
handler: swift
swift:
type: swift_mailer
from_email: noreply@xxxxxxx.com
to_email: user@xxxxx.com
subject: "[App] - Errore %kernel.environment%"
level: error
Monolog logs every 404 error, also missing assets like css and js. How can avoid this? Where I'm wrong?
Maybe the problem is related with my ExceptionListener?
/**
* @param GetResponseForExceptionEvent $event
*/
public function onKernelException(GetResponseForExceptionEvent $event)
{
//The logger object is my logger
$this->logger->log($event->getException(), $event->getRequest());
if (!$event->getRequest()->isXmlHttpRequest()) {
return;
}
$event->setResponse(new JsonResponse('message' => 'Ops. Houston we have a problem.'));
}
Thank you.
回答1:
You can filter errors in onKernelException method. See example below:
<?php
namespace AppBundle\Listener;
use Symfony\Component\HttpKernel\Event\GetResponseForExceptionEvent;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
class AppExceptionListener
{
private $logger;
public function __construct($logger)
{
$this->logger = $logger;
}
public function onKernelException(GetResponseForExceptionEvent $event)
{
$exception = $event->getException();
if(!$exception instanceof NotFoundHttpException)
{
$this->logger->info('Error');
}
}
}
回答2:
I post how I resolved. The problem isn't related with Monolog, but with my logger service.
Because I wrapped how to log exceptions, before I didn't pass the exception when I call
$logger->error('message error');
So when Monolog tries to enable the NotFoundActivationStrategy (file is located in /vendor/symfony/monolog-bundle/NotFoundActivationStrategy.php
), this check fails:
public function isHandlerActivated(array $record)
{
$isActivated = parent::isHandlerActivated($record);
if (
$isActivated
&& $this->request
&& isset($record['context']['exception'])
&& $record['context']['exception'] instanceof HttpException
&& $record['context']['exception']->getStatusCode() == 404
) {
//blacklist is the pattern that you can set on config.yml at excluded_404s node
return !preg_match($this->blacklist, $this->request->getPathInfo());
}
return $isActivated;
}
So I resolved with
$this->logger->error('message', array('exception' => $exception));
Hope this helps someone.
来源:https://stackoverflow.com/questions/37299284/monologbundle-fingercrossedhandler-how-to-configure-excluded-404s