57

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

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

SOAPサービスからのメッセージをログに記録したいのは次の場合のみです。

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

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

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

何か助け、手がかり?

4

3 に答える 3

80

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]

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

于 2011-11-21T11:16:02.867 に答える
31

同様の問題が発生したため、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');

サービスを引き続き使用して、新しいハンドラーをプッシュすることは可能かもしれません(完了したらポップします。そうしないと、カスタムログに必要以上に誤って書き込む可能性があります)が、これはテストしていません。正直なところ、ライブラリを直接使用する方が簡単なようでした。

于 2011-11-17T15:46:25.243 に答える
7

このリンクで説明されているように、 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という名前の動的に作成されたサービスを使用してルーガーにアクセスできます。

于 2016-08-10T14:22:05.553 に答える