2013-04-12 13 views
7

I in eine andere Datei protokollieren will als die üblichen dev.log oder prod.logSymfony 2.1 - Schalten Monolog Kanal im Regler

Ich weiß, dass dies mit verschiedenen Kanälen durchgeführt werden kann und ich es in mehreren Diensten , aber ich bin mir nicht ganz sicher, ob ich den Monolog-Kanal in einem Controller wechseln soll.

In einem Dienst definieren Sie den Kanal nur über das Attribut tags in der Service-Definition, aber wie kann ich dies in einem Controller oder noch besser in einer bestimmten Aktion tun?

Ich weiß, dass eine mögliche Lösung sein würde: Symfony 2 : Log into a specific file

Aber es scheint Overkill zwei neue Dienste zu definieren, nur zu einer benutzerdefinierten Datei protokolliert.

Antwort

23

Der einzige Weg, dies zu tun ist Ihre controller as a service und injiziert eine benutzerdefinierte Logger mit einem benutzerdefinierten Kanal zu definieren.

Da die Kanäle automatisch erstellt werden, gibt es derzeit keine andere Möglichkeit, aber es ist eine interessante Anfrage, und Sie sind nicht die erste, also habe ich issue on MonologBundle erstellt, um die Definition von Kanälen auf der Bundle-Konfigurationsebene zu ermöglichen. Auf diese Weise könnten Sie einfach den richtigen Logger von der Steuerung holen $this->get('monolog.logger.mychannel') mit (die Sie bereits tun, wenn der Kanal vorhanden ist, aber nicht, wenn Sie einen benutzerdefinierten Channel für den Controller wollen, die nichts anderes verwendet).

Update:

Ab symfony/Monolog-Bundle 2.4.0 Sie zusätzliche Kanäle definieren:

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

Dann können Sie es als $this->get('monolog.logger.mychannel')

+1

+1 für das Erstellen des Problems bei GitHub –

+2

@ JohannesKlauß die bevorstehende Veröffentlichung des Bundle Ich werde morgen eine ordnungsgemäße Lösung für diese BTW enthält. – Seldaek

3

abrufen kann ich bin zur Zeit Mit symfony/monolog-bundle 2.3.0 funktioniert der folgende Code.

Konfiguration in 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 

Auf Controller

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

Hoffe, es hilft.

+3

Dies funktioniert, es fehlen nur 'channels: ['doctrin']' vor Handlern – kunicmarko20

5

Ich weiß, dass dies ein älterer Beitrag, aber ich lief in ein ähnliches Bedürfnis symfony/Monolog-Bündel 2.1.x mit Ich konnte nicht scheinen zu finden, genau das, was ich in anderen Threads benötigt, so dass ich zu dokumentieren meine Lösung hier, die einen Logger Container eingebaut war, die einen benutzerdefinierten Kanal verwendet.

In config.yml

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

In meinem Bundle services.yml

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

In src/Acme/MyBundle/Monolog/UserActionsLogger.php

<?php 

namespace Acme\MyBundle\Monolog; 

class UserActionsLogger 
{ 
    public $logger; 

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

Dann können Sie entweder den Logger Behälter in einen anderen Dienst injizieren mit:

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

Oder Sie selektiv den Logger Container als Dienst in jedem Controller verwenden:

$userActionsLogger = $this->get('acme.logger.user_actions'); 

Dann können Sie auf den eigentlichen Logger zugreifen: