Saw*_*red 13 php logging error-logging console-application symfony
为什么不记录控制台任务的错误.例如php警告的异常:
[ErrorException]
Notice: Undefined offset: 1 in /var/www/project/vendor/doctrine/lib/Doctrine/ORM/Query.php line 298
我看到stdout中打印的内容,但没有记录到日志中.(我在cron中使用控制台命令).在Web中,这些异常使用回溯记录,在这种情况下,这种异常比仅仅异常更具信息性.
作为解决方案:我将所有进程函数包含在try..catch块中并手动记录回溯.
有谁知道如何在控制台任务中启用或配置日志记录.我认为它一定是某个地方.
小智 15
当我遵循代码时,实际上没有这样的选项来启用命令的日志记录.在app/console这个代码中:
use Symfony\Bundle\FrameworkBundle\Console\Application;
...
$application = new Application($kernel);
$application->run();
Run Code Online (Sandbox Code Playgroud)
它调用Symfony\Component\Console\Application::run()了try/catch块.renderException()调用异常方法,但不会在任何地方发生日志记录.
另请注意,app/console默认情况下始终会在异常时退出并显示错误代码.
您可以创建自己的Application类扩展Symfony\Bundle\FrameworkBundle\Console\Application和修改app/console以使用它.比你可以覆盖run()方法并添加错误记录.
或者你可以app/console像这样修改并处理错误:
// $application->run();
$application->setCatchExceptions(false);
try {
$output = new Symfony\Component\Console\Output\ConsoleOutput();
$application->run(null, $output);
} catch (Exception $e) {
... error logging ...
$application->renderException($e, $output);
$statusCode = $e->getCode();
$statusCode = is_numeric($statusCode) && $statusCode ? $statusCode : 1;
exit($statusCode);
}
Run Code Online (Sandbox Code Playgroud)
TL; DR:只使用这个包
从食谱:
要使控制台应用程序自动记录所有命令的未捕获异常,可以使用控制台事件.
创建标记为事件的事件侦听器的服务console.exception:
# services.yml
services:
kernel.listener.command_dispatch:
class: Acme\DemoBundle\EventListener\ConsoleExceptionListener
arguments:
logger: "@logger"
tags:
- { name: kernel.event_listener, event: console.exception }
Run Code Online (Sandbox Code Playgroud)
您现在可以使用控制台例外执行任何操作:
<?php
// src/Acme/DemoBundle/EventListener/ConsoleExceptionListener.php
namespace Acme\DemoBundle\EventListener;
use Symfony\Component\Console\Event\ConsoleExceptionEvent;
use Psr\Log\LoggerInterface;
class ConsoleExceptionListener
{
private $logger;
public function __construct(LoggerInterface $logger)
{
$this->logger = $logger;
}
public function onConsoleException(ConsoleExceptionEvent $event)
{
$command = $event->getCommand();
$exception = $event->getException();
$message = sprintf(
'%s: %s (uncaught exception) at %s line %s while running console command `%s`',
get_class($exception),
$exception->getMessage(),
$exception->getFile(),
$exception->getLine(),
$command->getName()
);
$this->logger->error($message);
}
}
Run Code Online (Sandbox Code Playgroud)