canal de registro de monólogo personalizado en el comando symfony2

En este artículo del libro de cocina , podemos ver cómo usar un canal personalizado en un servicio. Pero, ¿cómo puedo usar un canal de inicio de sesión personalizado en un comando?

Creé un comando symfony2 para realizar algo. Me gustaría usar el monólogo para registrar cosas hechas por mi comando.

En realidad, quiero escribir el registro de mi comando en otro archivo que no sean los registros de la aplicación.

Cualquier comando personalizado que extienda ContainerAwareCommand , tiene acceso al contenedor de servicios de Symfony. Puede definir un servicio que inicia sesión en un canal personalizado en su configuración.

   mychannel   

Puede acceder a su servicio desde el comando de la siguiente manera

 $logger = $this->getContainer()->get('console.logger'); 

Este registrador se registrará con el canal como “mychannel”.

FYI El servicio de registrador predeterminado inicia sesión en el canal “aplicación”. Esto se puede ver en el archivo Symfony/Bundle/MonologBundle/Resources/config/monolog.xml . Este es también el lugar donde se define el servicio de logger predeterminado.

   app       

Una pregunta similar fue hecha y respondida aquí:

¿Cómo se escriben los registros de un servicio en un archivo separado?

Gracias

Pruebe esto, use la biblioteca directamente

 use Monolog\Logger; use Monolog\Handler\StreamHandler; // ... // create a log channel $log = new Logger('name'); $log->pushHandler(new StreamHandler('path of log file', Logger::WARNING)); //add the erros to log file try { //do something } catch(Exception $e) { $log->addError($e->getMessage()); } 

Tal vez esto pueda resolver su problema, agregue esto en su archivo de comando.

En la mayoría de los casos, su comando extiende ContainerAwareCommand (como se ve aquí: http://symfony.com/doc/current/cookbook/console.html#creating-a-basic-command ).

Esto significa que su comando tiene acceso al contenedor de servicios de Symfony, que es una gran cantidad de todos los servicios dentro de Symfony (es decir, los objetos útiles). En su caso, necesita el servicio de logger , que puede obtener sacándolo del contenedor:

 $logger = $this->getContainer()->get('logger'); 

(referencia: http://symfony.com/doc/current/cookbook/console.html#getting-services-from-the-service-container )

Ahora puedes usar el registrador como siempre. Si alguna vez necesita otros servicios, solo revise el php app/console container:debug , que enumera todos los servicios en el contenedor.

¡Buena suerte!

Para Symfony 3.3 debido a los servicios de auto-conexión cuando desea iniciar sesión en archivos separados, siga este enfoque:

Por ejemplo, supongamos que necesitamos iniciar sesión en 2 archivos rotativos:

  • exception.log : para excepciones causadas en la aplicación.
  • dataFetch.log : para llamadas a una aplicación que recupera los datos de las aplicaciones.

El en services.yml puso:

 monolog: channels: ['dataFetch', 'exception'] handlers: dataFetch: type: 'rotating_file' level: info type: stream path: 'dataFetch.log' max_files: 7 channels: dataFetch exception: type: 'rotating_file' level: error type: stream path: 'exception.log' max_files: 7 channels: exception 

Ahora, para el loger de excepciones, puede inyectar la dependencia de anuncios monolog.logger.exception mientras que para dataFetch puede inyectar la monolog.logger.dataFetch dependencia.