2013-04-12 5 views
7

でモノローグチャネルを切り替えて、私はいくつかのサービスでそれを使用しかし、コントローラでMonologチャンネルを切り替えることについてはあまり明確ではありません。symfonyの2.1 - 私はこれが異なるチャネルで行うことができることを知っている</p> <p>をいつもdev.logとは異なるファイルにログインまたはprod.logしたいコントローラ

サービスでは、サービス定義のtags属性を使用してチャネルを定義するだけですが、コントローラでこれを実行するにはどうすればよいでしょうか、特定のアクションでさらに改善できますか?

私は可能な解決策はこれだろうことを知っている:Symfony 2 : Log into a specific file

しかし、それだけでカスタムファイルへのロギングのための2つの新しいサービスを定義するためにやり過ぎと思われます。

答えて

23

これを実行する唯一の方法は、controller as a serviceを定義し、カスタムチャネルを持つカスタムロガーを注入することです。

チャンネルは自動的に作成されるので、現在のところ他の方法はありませんが、面白いリクエストであり、最初ではないので、issue on MonologBundleを作成してバンドル設定レベルでチャンネルを定義できます。そうすれば、コントローラーから適切なロガーを取り出すことができます。これは、チャンネルが存在する場合には既に実行できますが、他に何も使用していないコントローラー用のカスタムチャネルが必要な場合には使用できません。

更新:

はsymfony /モノローグバンドルは、あなたのように、追加のチャネルを定義することができます2.4.0のとおり:

monolog: 
    channels: ["foo", "bar"] 

次に、あなたは$this->get('monolog.logger.mychannel')

+1

+1をgithubで作成するには –

+2

@JohannesKlauß明日になるバンドルの今後のリリースには、このbtwの適切な修正が含まれています。 – Seldaek

3

としてそれを取得することができます私は現在、午前symfony/monolog-bundle 2.3.0と以下のコードが動作します。コントローラ

$doctrineLogger = $this->get('monolog.logger.doctrine'); 

config.yml

monolog: 
    handlers: 
     main: 
      type: stream 
      path: %kernel.logs_dir%/%kernel.environment%.log 
      level: info 
     doctrine: 
      type: stream 
      path: %kernel.logs_dir%/doctrine_%kernel.environment%.log 
      level: debug 
      channels: doctrine 

の設定は、それがお役に立てば幸いです。

+3

これは動作しています。ハンドラの前に 'channels:['doctrine']'が不足しています – kunicmarko20

5

私はこれが古い投稿であることを知っていますが、symfony/monolog-bundle 2.1.xを使って同様の必要性に遭遇しました。私は他のスレッドで必要なものを正確に見つけることができなかったので、ここで私の解決策を文書化しています。これは、カスタムチャネルを使用するロガーコンテナを作成することでした。 SRC /アクメ/ MyBundle /モノローグ/ UserActionsLoggerで私のバンドルのservices.yml

acme.logger.user_actions: 
    class: Acme\MyBundle\Monolog\UserActionsLogger 
    arguments: ['@logger'] 
    tags: 
     - { name: monolog.logger, channel: user_actions } 

monolog: 
    handlers: 
     user_actions: 
      type: stream 
      path: "%kernel.logs_dir%/%kernel.environment%-user-actions.log" 
      level: info 
      channels: [user_actions] 

config.ymlで

$userActionsLogger = $this->get('acme.logger.user_actions'); 
:あなたが選択的に任意のコントローラのサービスとしてロガーコンテナを使用することができ、

acme.user.authenticationhandler: 
    class: %acme.user.authenticationhandler.class% 
    public: false 
    arguments: ['@router', '@security.context', '@acme.logger.user_actions'] 

または:PHP

<?php 

namespace Acme\MyBundle\Monolog; 

class UserActionsLogger 
{ 
    public $logger; 

    public function __construct($logger) 
    { 
     $this->logger = $logger; 
    } 
} 

は、その後、あなたはと別のサービスにロガーコンテナを注入しますか、

次に、実際のロガーにアクセスできます。

$userActionsLogger->logger->info('A thing happened!') 
関連する問題

 関連する問題