2

Symfony2が独自のログとシステムログを書き込むファイルとは別のファイルにアプリケーションログを書き込みたい。私はこのような自分のサービスを作成する必要があることを理解しました:

services:
    actionslogger:
        class: Symfony\Bridge\Monolog\Logger
        arguments: [app]
        calls:
             - [pushHandler, [@actionslogger_handler]]
    actionslogger_handler:
        class: Monolog\Handler\StreamHandler       
        arguments: [%kernel.logs_dir%/actions_%kernel.environment%.log, 200]

$ logger = $ this-> get('actionslogger');を使用すると、これで問題なく動作します。私のアプリケーションでは、それで問題ありません。しかし、ログの書き込み方法を管理するために、フォーマッターとプロセッサーも使用したいと思います。これを行うには、次の構成を使用します。

services:
    actionslogger.formatter.session_request:
        class: Monolog\Formatter\LineFormatter
        arguments:
            - "[%%datetime%%] [%%extra.token%%] %%channel%%.%%level_name%%: %%message%%\n"

    actionslogger.processor.session_request:
        class: My\Bundle\LogProcessor
        arguments:  [ @session ]
        tags:
            - { name: actionslogger.processor, method: processRecord }

この設定でSymfony2のデフォルトロガーでこのフォーマッターとプロセッサーを使用できます:

monolog:
    handlers:
        main:
            type:  stream
            path:  %kernel.logs_dir%/%kernel.environment%.log
            level: debug
            formatter: actionslogger.formatter.session_request

しかし、自分のロガーでフォーマッターを使用できる場合、プロセッサーは使用できません。これが私の設定です:

services:
    actionslogger.formatter.session_request:
        class: Monolog\Formatter\LineFormatter
        arguments:
            - "[%%datetime%%] [%%extra.token%%] %%channel%%.%%level_name%%: %%message%%\n"

    actionslogger.processor.session_request:
        class: My\Bundle\LogProcessor
        arguments:  [ @session ]
        tags:
            - { name: actionslogger.processor, channel: app, method: processRecord, handler: @actionslogger_handler }

    actionslogger:
        class: Symfony\Bridge\Monolog\Logger
        arguments: [app]
        calls:
             - [pushHandler, [@actionslogger_handler]]
    actionslogger_handler:
        class: Monolog\Handler\StreamHandler       
        arguments: [%kernel.logs_dir%/actions_%kernel.environment%.log, 200]
        calls:
             #- [pushProcessor, [???]]
             - [setFormatter, [@actionslogger.formatter.session_request]]

プロセッサの設定のタグチャネルとハンドラは役に立たないようです。

プロセッサをロガーで動作させるにはどうすればよいですか?コメント行のpushProcessorメソッドに何を渡す必要がありますか(それが有効なオプションである可能性がある場合)?

助けてくれてありがとう。

注:Symfony2.0.0を使用する

4

2 に答える 2

1

processRecordメソッドの名前をに変更します__invoke。これにより、LogProcessorインスタンスが呼び出し可能になり、対応するサービスをプロセッサとして渡すことができるようになります。

于 2015-10-15T15:59:15.500 に答える
0

自分への答え:

さて、これを設定する方法を見つけることができなかったので、私はこのそれほど重くない解決策に行き着きました:

私は新しいロガーを作成します。これは非常に単純で、コンストラクターの新しいプロセッサーに影響を与えるため、ファイルはMy / Bundleにあり、次のようになります。

#LogProcessor.php

use Symfony\Component\HttpFoundation\Session;
class LogProcessor
{
    private $session;
    private $token;
    public function __construct(Session $session)
    {
        $this->session = $session;
    }
    public function processRecord(array $record)
    {
        if (null === $this->token) {
            try {
                $this->token = ($this->session->getId());
            } catch (\RuntimeException $e) {
                $this->token = '????????';
            }
            $this->token .= '#' . substr(uniqid(), -8);
        }
        $record['extra']['token'] = $this->token;
        $record['extra']['context'] = "";
        foreach($record['context'] as $key=>$value) {
            $key=str_replace(array("=","#","|"),"",$key);
            $value=str_replace(array("=","#","|"),"",$value);
            $record['extra']['context'].=$key."=".$value."#";
        }
        return $record;
    }
}

#MyLogger.php

use Symfony\Bridge\Monolog\Logger;
use Symfony\Component\HttpFoundation\Session;
use My\Bundle\LogProcessor;

class MyLogger extends Logger {
    private $session;
    private $processor;

    public function __construct($name, Session $session)
    {
        parent::__construct($name);
        $this->session= $session;
        $this->processor= new LogProcessor($session);
        $this->pushProcessor((array($this->processor, 'processRecord')));
    }   
}

(後でLoggerのaddRecordメソッドを変更したい場合にも便利です)

次に、次のような新しいサービスを作成します。

#app/config/config.yml or src/My/Bundle/Resources/config/services.yml (if imported in app/config/config.yml)

services:
    mylogger:
        class: My\Bundle\MyLogger
        arguments: [app, @session]
        calls:
             - [pushHandler, [@mylogger.handler]]
    mylogger.handler:
        class: Monolog\Handler\StreamHandler       
        arguments: [%kernel.logs_dir%/actions_%kernel.environment%.log, 200] # 200 means "INFO"
        calls:
             - [setFormatter, [@monolog.formatter.compactformat]]
    monolog.formatter.compactformat:
        class: Monolog\Formatter\LineFormatter
        arguments:
            - "%%datetime%%|%%channel%%|%%level_name%%|%%extra.token%%|%%message%%|%%extra.context%%\n"

そして、ここに行きます。これで、フォーマッター/および/プロセッサーで新しいロギングサービスを使用し、それらを使用して必要な処理を実行できます(ここでは、セッションIDとログコンテキスト情報を使いやすい形式で追加します)。

#MyController.php
public function myMethod() {
    ...
    $logger = $this->get('mylogger');
    $logger->info('ACCESS PAGE', array('user'=>$userName, 'IP'=>$userIP, 'section'=>$section));
    ...
}

とにかく、誰かが私の最初の質問(パーソナルロギングサービスにプロセッサをリンクする方法について、設定で直接)に対する答えを持っている場合は、ここに投稿してください。

于 2012-07-18T12:33:46.573 に答える