symfony2命令中的自定义monolog日志记录通道

时间:2011-10-10 15:04:52

标签: php symfony

在此cookbook article中,我们可以了解如何在服务中使用自定义渠道。但是如何在命令中使用自定义登录通道?

我创建了一个symfony2命令来执行某些操作。我想使用monolog记录我的命令完成的事情。

实际上,我想在另一个文件中为我的命令编写日志而不是应用程序的日志。

5 个答案:

答案 0 :(得分:6)

任何扩展ContainerAwareCommand的自定义命令都可以访问Symfony的服务容器。您可以定义在配置中登录自定义渠道的服务。

<services>
    <service id="console.logger" parent="monolog.logger_prototype">
        <argument index="0">mychannel</argument>
    </service>
</services>

您可以通过以下方式从命令访问您的服务

$logger = $this->getContainer()->get('console.logger');

此记录器将使用频道记录为“mychannel”。

FYI默认记录器服务记录到频道“app”。这可以在文件中看到 Symfony/Bundle/MonologBundle/Resources/config/monolog.xml。这也是定义默认logger服务的地方。

<services>
    <service id="monolog.logger" parent="monolog.logger_prototype" public="false">
        <argument index="0">app</argument>
    </service>

    <service id="logger" alias="monolog.logger" />

    <service id="monolog.logger_prototype" class="%monolog.logger.class%" abstract="true">
        <argument /><!-- Channel -->
    </service>
</services>

答案 1 :(得分:4)

在这里提出并回答了类似的问题:

How to write logs from one service into separate file?

由于

答案 2 :(得分:4)

试试这个,直接使用库

use Monolog\Logger;
use Monolog\Handler\StreamHandler;

// ...

// create a log channel
$log = new Logger('name');
$log->pushHandler(new StreamHandler('path of log file', Logger::WARNING));

//add the erros to log file

try {
    //do something
} catch(Exception $e) {
    $log->addError($e->getMessage());
}

也许这可以解决您的问题,将其添加到您的命令文件中。

答案 3 :(得分:0)

在大多数情况下,您的命令扩展了ContainerAwareCommand(如下所示:http://symfony.com/doc/current/cookbook/console.html#creating-a-basic-command)。

这意味着您的命令可以访问Symfony的服务容器 - 这是Symfony内部所有服务的大包(即有用的对象)。在您的情况下,您需要logger服务,您可以通过将其从容器中取出来获得:

$logger = $this->getContainer()->get('logger');

(参考:http://symfony.com/doc/current/cookbook/console.html#getting-services-from-the-service-container

现在您可以正常使用记录器了。如果您需要任何其他服务,只需查看php app/console container:debug命令,该命令列出容器上的每个服务。

祝你好运!

答案 4 :(得分:0)

对于Symfony 3.3,因为当您想要登录单独的文件时使用自动服务,请遵循以下方法:

例如,让我们假设我们需要登录2个旋转文件:

  • exception.log:适用于应用程序中的异常。
  • dataFetch.log:用于调用api来检索应用程序数据。

on services.yml put:

monolog:
  channels: ['dataFetch', 'exception']

  handlers:

    dataFetch:
     type: 'rotating_file'
     level: info
     type: stream
     path: 'dataFetch.log'
     max_files: 7
     channels: dataFetch

    exception:
         type: 'rotating_file'
         level: error
         type: stream
         path: 'exception.log'
         max_files: 7
         channels: exception

现在,对于异常loger,您可以为monolog.logger.exception注入广告依赖关系,而对于dataFetch,您可以依赖注入monolog.logger.dataFetch