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í.