web-dev-qa-db-ja.com

1つのサービスから別のファイルにログを書き込む方法は?

通常、loggerサービスを取得するだけで、ログは次の場所に移動します。

%kernel.root_dir%/%kernel.environment%.log

SOAP services [〜#〜] only [〜#〜]にメッセージを記録したい:

%kernel.root_dir%/%kernel.environment%.soap.log

メインのログファイルではありません。

クックブックを読みましたが、monologの設定方法がわかりません。

ヘルプ、手がかり?

57
canni

MonologBu​​ndleは、フレームワーク全体に対して同じハンドラーを使用してすべてを記録します。つまり、サービスの1つが異なるハンドラーにログを記録する必要がある場合、独自のロガー/ハンドラーを作成し、それをサービスに挿入する必要があります。

これは設定例(yaml内)になります:

services:
    my_logger:
        class: Symfony\Bridge\Monolog\Logger
        arguments: [soap]
        calls:
            - [pushHandler, [@my_handler]]

    my_handler:
        class: Monolog\Handler\StreamHandler
        # 200 = INFO, see Monolog::Logger for the values of log levels
        arguments: [%kernel.root_dir%/%kernel.environment%.soap.log, 200]

    soap_service:
        class: Your\Soap\Client
        arguments: [@my_logger]

これで明らかになることを願っています。

更新: symfony 2.1の時点で、どのチャンネルがどのハンドラーを受信するかを設定することもできるため、代わりに次のようなことができます:

services:
     soap_service:
         class: Your\Soap\Client
         arguments: [@logger]
         tags:
             - { name: monolog.logger, channel: soap }

新しいsoapチャネル(つまり、すべてのハンドラーを受信するロガーインスタンス)を作成し、このチャネルに異なるハンドラーを構成します。

monolog:
    handlers:
        main:
            type: stream
            path: %kernel.root_dir%/%kernel.environment%.log
            level: error
            channels: [!soap]
        soap:
            type: stream
            path: %kernel.root_dir%/%kernel.environment%.soap.log
            level: info
            channels: [soap]

これは、メインハンドラーがsoapチャネル以外のすべてを受け取り、soapハンドラーがsoapチャネルのみを受け取ることを意味します。また、メインログファイルにすべてを保持するが、soapログのみのコピーを個別に保持する場合は、メインハンドラーのchannelsキーを削除することもできます。これにより柔軟性が大幅に向上します。また、チャンネルは配列であるため、必要なチャンネルを一覧表示するか、ブラックリスト!name一部を除外し、他のすべてを含める表記。

79
Seldaek

同様の問題があり、Monologサービスの代わりにMonologライブラリを直接使用することにしました。

MonologはMonolog\Handler\StreamHandlerを使用してファイルに書き込みます。 githubページ には簡単な例があります:

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

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

// add records to the log
$log->addWarning('Foo');
$log->addError('Bar');

サービスを引き続き使用して、新しいハンドラーをプッシュするだけで(完了したらポップします-そうしないと、意図せずにカスタムログに意図せずに書き込みが行われる可能性があります)、これをテストしていません。正直なところ、ライブラリを直接使用する方が簡単だと思われました。

29

このリンクで説明されているようにconfig.ymlでカスタムチャネルを作成することで同じ問題を解決しました メッセージを異なるファイルに記録する方法

monolog:
    channels: ['my_logger']

    handlers:
        my_logger:
            level:    debug
            type:     stream
            path:     '%kernel.logs_dir%/my_logger.log'
            channels: [my_logger]

この後、動的に作成されたmonolog.logger.my_loggerという名前のサービスを使用してloogerにアクセスできます

7
Genoud Magloire