2011-10-10 81 views
15

在此cookbook article中,我们可以看到如何在服务中使用自定义通道。但是我怎样才能在命令中使用自定义登录频道?symfony2命令中的自定义monolog日志记录通道

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

实际上,我想在除了应用程序的日志之外的另一个文件中写入我的命令的日志。

+0

我想知道如何做到这一点 – HappyDeveloper

+2

在http://stackoverflow.com/questions/8169114/how-to-write-logs-from-one-service-into-separate-file/8210892#8210892 – Seldaek

+0

谢谢,我用这个链接回答了我的问题。 – Reuven

回答

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命令,其中列出了容器上的每项服务。

祝你好运!

+1

感谢您的回答。我知道如何使用记录器。我想知道如何使用这个记录器的自定义通道。我想将我的命令的结果记录在另一个文件中。 – Reuven

+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”。

仅供参考默认记录器服务记录到频道“应用程序”。这可以在文件 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> 
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()); 
} 

或许这能够解决您的问题,添加到您的命令文件这一点。

0

对于Symfony的3.3,因为当你要登录单独的文件都遵循这种方法的自动装配服务:

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

  • exception.log:对于应用程序中导致的异常。
  • dataFetch.log:对于调用API检索应用程序数据。

services.yml放:

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