Log de todas las acciones del usuario, separado por días en Symfony 2

Una ncecesidad que tuve hace poco era la de saber que acciones hacia el usuario pero sin entrar en el mas minimo detalle, solo queria saber por donde pasaba.

Encontre la siguiente solucion que consiste en crear una clase que implemente la interfaz “EventSubscribeInterface” y dentro de ella podremos implementar el evento del kernel de Symfony llamado “onKernelRequest()” el cual sera llamado en cada request que se haga en el sistema. Aqui dentro guardaremos en los logs de Symfony las llamadas a las acciones de los controladores.

Vamos al lio:

1- Crear la clase LogListener:

class LogListener implements EventSubscriberInterface
{
    /** @var SecurityContextInterface */
    private $context;
    /** @var Logger $logger */
    private $logger;

    public function __construct(SecurityContextInterface $context, Logger $logger)
    {
        $this->context = $context;
        $this->logger = $logger;
    }

    public function onKernelRequest(GetResponseEvent $event)
    {
        /** @var Request $request */
        $request = $event->getRequest();
        try {
            $username = 'anon.';
            $controllerName = $request->attributes->get('_controller');
            if(strpos($controllerName, '::') !== false){
                $params = $request->attributes->get('_route_params');
                $data = array($controllerName, $params);
                $this->logger->addInfo($username, $data);
            }
        } catch (\Exception $e) {
            $this->logger->addInfo("[EXCEPCION]", array($e->getMessage()));
        }
    }

    //This method is mandatory by the interface
    public static function getSubscribedEvents()
    {
        return array(
            KernelEvents::REQUEST => array(array('onKernelRequest', 1)),
        );
    }
}

2- Crear un nuevo canal exclusivo para ese logger dentro de app/config/config_dev.yml y app/config/config_prod.yml. MUY IMPORTANTE: definir el type como rotating_file para que  separe por dias los logs.

monolog:
    handlers:
        god:
            type: rotating_file
            path: "%kernel.logs_dir%/god_kernel.environment%.log"
    channels: [..., 'god']

Otra opción es hacerlo a nivel de servidor, instalando un programa en Ubuntu llamado logrotate que basicamente hacelo mismo. Os dejo un link por si lo quereis ojear. https://www.digitalocean.com/community/tutorials/how-to-manage-log-files-with-logrotate-on-ubuntu-12-10

3- Añadir la clase como un servicio dentro de /BundleName/Resources/config/listeners.xml y inyectarle el log con canal que hemos definido anteriormente.

<service id="site.log_listener" class="BundleName\Listener\LocaleListener">
    <argument type="service" id="security.context" />
    <argument type="service" id="monolog.logger.god" />
    <tag name="kernel.event_subscriber"/>
</service>

Y bueno, solo queda probarlo y ver como se generan los por cada dia. De esa forma, podeis logear en un determinado dia, y comprobar que acciones a realizado un usuario por si hubiera algún error en vuestro proyecto.

Lo dicho, cualquier sugerencia o comentario, sera de gran ayuda.

Saludos ¡