2011-10-10 10 views
15

このcookbook articleには、サービス内でカスタムチャネルを使用する方法があります。しかし、コマンドでカスタムログインチャネルを使用するにはどうすればよいですか?symfony2コマンドのカスタムモノログロギングチャネル

何かを実行するsymfony2コマンドを作成しました。私は、私の命令で行われたことを記録するためにモノログを使いたいと思う。

実際には、私のコマンドのログをアプリケーションのログ以外のファイルに書きたいと思います。

+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 = $this->getContainer()->get('logger'); 

http://symfony.com/doc/current/cookbook/console.html#getting-services-from-the-service-container参照:)あなたのケースでは、あなたが容器の外にそれをつかむことで得ることができますloggerサービスを、必要とします。他のサービスが必要な場合は、php app/console container:debugコマンドをチェックするだけで、コンテナのすべての単一サービスがリストされます。

幸運を祈る!

+1

感謝。私はロガーの使い方を知っています。私はこのロガーのカスタムチャンネルをどのように使うことができるかを知りたいです。私は別のファイルに私のコマンドの結果を記録したいと思います。 – Reuven

+0

良い質問。誰でも答えを知っていますか? –

6

任意のカスタムコマンド、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> 
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()); 
} 

をライブラリを使用しています。なぜならautowireサービスのsymfonyの3.3については

0

あなたが別々のファイルに記録したい、このアプローチは、次のとおりです。たとえば

は、私たちは私たちが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.dataFetchを注入依存関係ができdataFetchため monolog.logger.exceptionながら、依存関係の広告を注入することができます。