このcookbook articleには、サービス内でカスタムチャネルを使用する方法があります。しかし、コマンドでカスタムログインチャネルを使用するにはどうすればよいですか?symfony2コマンドのカスタムモノログロギングチャネル
何かを実行するsymfony2コマンドを作成しました。私は、私の命令で行われたことを記録するためにモノログを使いたいと思う。
実際には、私のコマンドのログをアプリケーションのログ以外のファイルに書きたいと思います。
このcookbook articleには、サービス内でカスタムチャネルを使用する方法があります。しかし、コマンドでカスタムログインチャネルを使用するにはどうすればよいですか?symfony2コマンドのカスタムモノログロギングチャネル
何かを実行するsymfony2コマンドを作成しました。私は、私の命令で行われたことを記録するためにモノログを使いたいと思う。
実際には、私のコマンドのログをアプリケーションのログ以外のファイルに書きたいと思います。
ほとんどの場合、あなたのコマンドは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
コマンドをチェックするだけで、コンテナのすべての単一サービスがリストされます。
幸運を祈る!
感謝。私はロガーの使い方を知っています。私はこのロガーのカスタムチャンネルをどのように使うことができるかを知りたいです。私は別のファイルに私のコマンドの結果を記録したいと思います。 – Reuven
良い質問。誰でも答えを知っていますか? –
任意のカスタムコマンド、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>
これを試してみて、多分これはあなたのコマンドファイルにこれを追加し、あなたの問題を解決することができ、直接
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については
あなたが別々のファイルに記録したい、このアプローチは、次のとおりです。たとえば
は、私たちは私たちが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
ながら、依存関係の広告を注入することができます。
これを行う方法も知りたいです。 – HappyDeveloper
回答済みhttp://stackoverflow.com/questions/8169114/how-to-write-logs-from-one-service-into-separate-file/8210892#8210892 – Seldaek
ありがとう、私はこのリンクで私の質問に答えました。あなたの答えのため – Reuven