que original factura electronica cadena logging symfony processor formatter

logging - original - factura electronica github



Symfony2: utilice procesadores al iniciar sesiĆ³n en archivos diferentes (2)

Quiero escribir los registros de mi aplicación en otro archivo que el que Symfony2 escribe en sus propios registros y registros del sistema. Entendí que necesitaba crear un servicio propio así:

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]

Eso funciona bien cuando uso $ logger = $ this-> get (''actionslogger''); en mi aplicación, así que está bien. Pero también quiero usar un formateador y un procesador para administrar la forma en que se escriben mis registros. Para hacer eso, uso esta configuración:

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 }

Puedo usar este formateador y procesador con el registrador predeterminado Symfony2 con esta configuración:

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

Pero si puedo usar el formateador con mi propio registrador, no puedo usar el procesador. Aquí está mi configuración:

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]]

El canal de etiquetas y el controlador en la configuración del procesador parece inútil.

¿Qué puedo hacer para que el procesador funcione con mi registrador? ¿Qué debo pasar al método pushProcessor en la línea comentada (si esa pudiera ser una opción válida)?

Gracias por la ayuda.

Nota: usando Symfony 2.0.0


Cambie el nombre de su método __invoke a __invoke . Eso hace que las instancias de LogProcessor se puedan llamar, y usted podrá pasar el sericio correspondiente como procesador.


Responde a mi mismo:

Bueno, no pude encontrar cómo configurar esto, así que terminé con esta solución no tan pesada:

Creo un nuevo registrador, que es bastante simple, y lo afecto a mi nuevo procesador en el constructor, por lo que los archivos están en My / Bundle y así:

#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''))); } }

(Eso podría ser útil si quiero modificar el método addRecord de Logger más adelante)

Luego creo un nuevo servicio como este:

#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"

Y aquí voy. Ahora puedo usar mi nuevo servicio de registro, con mi Formatter / y / my Processor, y hacer lo que quiera con ellos (aquí: agregar la identificación de sesión y registrar la información de contexto en un formato fácil de usar).

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

De todos modos, si alguien tiene la respuesta para mi primera pregunta (sobre cómo vincular el procesador en un servicio de registro personal, directamente en la configuración), publique aquí.