logging - poner - etiquetas css
¿Cómo se escriben los registros de un servicio en un archivo separado? (3)
Normalmente solo obtiene el servicio logger
, y los registros van a:
%kernel.root_dir%/%kernel.environment%.log
Me gustaría ingresar mensajes de los servicios SOAP SOLO a:
%kernel.root_dir%/%kernel.environment%.soap.log
no al archivo de registro principal.
He leído el libro de cocina, pero no entiendo cómo configurar el monólogo.
Cualquier ayuda, pistas?
El MonologBundle registra todo usando los mismos controladores para todo el framework. Eso significa que si uno de sus servicios necesita registrarse en diferentes manejadores, debe crear su propio Logger / Handler e inyectarlo en su servicio.
Esto podría ser una configuración de ejemplo (en yaml):
services:
my_logger:
class: Symfony/Bridge/Monolog/Logger
arguments: [soap]
calls:
- [pushHandler, [@my_handler]]
my_handler:
class: Monolog/Handler/StreamHandler
# 200 = INFO, see Monolog::Logger for the values of log levels
arguments: [%kernel.root_dir%/%kernel.environment%.soap.log, 200]
soap_service:
class: Your/Soap/Client
arguments: [@my_logger]
Espero que esto lo aclare.
Actualización: a partir de Symfony 2.1, también puede configurar qué canales reciben qué manejadores, por lo que alternativamente puede hacer algo como esto:
services:
soap_service:
class: Your/Soap/Client
arguments: [@logger]
tags:
- { name: monolog.logger, channel: soap }
Que crea un nuevo canal de jabón (es decir, una instancia de registrador que recibe todos los controladores) y luego configura diferentes controladores para este canal:
monolog:
handlers:
main:
type: stream
path: %kernel.root_dir%/%kernel.environment%.log
level: error
channels: [!soap]
soap:
type: stream
path: %kernel.root_dir%/%kernel.environment%.soap.log
level: info
channels: [soap]
Esto significa que el controlador principal recibirá todo menos el canal de jabón, y el controlador de jabón recibirá solo el canal de jabón. También puede eliminar la clave de channels
en el controlador principal si desea que su archivo de registro principal tenga todo, pero también tenga una copia de los registros de soap por separado. Esto brinda mucha flexibilidad, y como ve los canales es una matriz para que pueda enumerar los canales que desea, o utilizar la notación de !name
la lista negra para excluir algunos e incluir todo lo demás.
Tuve un problema similar y elegí usar la biblioteca Monolog directamente en lugar del servicio Monolog.
Monolog usa Monolog/Handler/StreamHandler
para escribir en archivos. La página de github tiene un ejemplo simple:
use Monolog/Logger;
use Monolog/Handler/StreamHandler;
// create a log channel
$log = new Logger(''name'');
$log->pushHandler(new StreamHandler(''path/to/your.log'', Logger::WARNING));
// add records to the log
$log->addWarning(''Foo'');
$log->addError(''Bar'');
Es posible seguir utilizando el servicio y simplemente presionar un nuevo controlador (y abrirlo una vez que haya finalizado; de lo contrario, es posible que escriba inadvertidamente más de lo que deseaba en el registro personalizado) pero no lo he probado. Honestamente, parecía más fácil usar la biblioteca directamente.
Resolví el mismo problema creando canales personalizados en config.yml como se explica en este enlace Cómo registrar mensajes en diferentes archivos .
monolog:
channels: [''my_logger'']
handlers:
my_logger:
level: debug
type: stream
path: ''%kernel.logs_dir%/my_logger.log''
channels: [my_logger]
Después de esto, puedo acceder a mi looger con un servicio creado dinámicamente llamado monolog.logger.my_logger