How to configure Monolog to store logs into MongoDB with Symfony2 and Doctrine

后端 未结 1 876
无人及你
无人及你 2021-01-15 05:09

Would it be possible to get a full example of how is it possible to configure Monolog to store its logs into MongoDB using Symfony 2.6 and Doctrine 2?

相关标签:
1条回答
  • 2021-01-15 05:52

    Full configuration

    /app/parameters.yml

    mongodb_server: "mongodb://localhost:27017"
    mongodb_username: "vagrant"
    mongodb_password: "password"
    mongodb_database: "testdb"
    

    /app/config.yml

    # Doctrine2 MongoDB Bundle
    # http://symfony.com/doc/current/bundles/DoctrineMongoDBBundle/index.html
    doctrine_mongodb:
        default_database: %mongodb_database%
        connections:
        default:
            server: %mongodb_server%
            options:
                password: %mongodb_password%
                username: %mongodb_username%
                db: %mongodb_database%
                connect: true
        log:
            server: %mongodb_server%
            options:
                password: %mongodb_password%
                username: %mongodb_username%
                db: %mongodb_database%
                connect: true
        document_managers:
        default:
            auto_mapping: true
        log:
            auto_mapping: false
            logging: false
    

    /app/services.yml

    mongolog:
        class: Doctrine\MongoDB\Connection
        factory_service: doctrine_mongodb.odm.log_connection
        factory_method: getMongoClient
    

    /app/config_dev.yml

    In this example I decided to store everything (debug level) as always into the dev.log and just errors, warnings and notices on mongo.

    monolog:
        handlers:
        main:
            type:   stream
            path:   "%kernel.logs_dir%/%kernel.environment%.log"
            level:  debug
        console:
            type:   console
            bubble: false
            verbosity_levels:
                VERBOSITY_VERBOSE: INFO
                VERBOSITY_VERY_VERBOSE: DEBUG
            channels: ["!doctrine"]
        console_very_verbose:
            type:   console
            bubble: false
            verbosity_levels:
                VERBOSITY_VERBOSE: NOTICE
                VERBOSITY_VERY_VERBOSE: NOTICE
                VERBOSITY_DEBUG: DEBUG
            channels: ["doctrine"]
        mongo:
            type:   mongo
            level:  notice # change as desired
            mongo:
                id: mongolog
                database: %mongodb_database%
                collection: logs
    

    /app/config_prod.yml

    monolog:
        handlers:
        main:
            type:         fingers_crossed
            action_level: error
            handler:      mongo
        nested:
            type:  stream
            path:  "%kernel.logs_dir%/%kernel.environment%.log"
            level: debug
        console:
            type:  console
        mongo:
            type: mongo
            level: notice
            mongo:
                id: mongolog
                database: %mongodb_database%
                collection: logs
    

    Now let's trigger a PHP notice and check if it'll be stored on MongoDB properly :-)

    <?php trigger_error('hello world!', E_USER_NOTICE);

    Adding HTTP request headers to Monolog record

    /app/services.yml

    kernel.listener.exception_listener:
        class: AppBundle\EventListener\ExceptionListener
        arguments:
            - @logger
        tags:
            - { name: kernel.event_listener, event: kernel.exception, method: onKernelException }
    

    AppBundle\EventListener\ExceptionListener

    <?php
    
    namespace AppBundle\EventListener;
    
    use Monolog\Handler\MongoDBHandler;
    use Symfony\Bridge\Monolog\Logger;
    use Symfony\Component\Debug\ExceptionHandler;
    use Symfony\Component\HttpKernel\Event\GetResponseForExceptionEvent;
    
    /**
     * Class ExceptionListener
     * @package AppBundle\EventListener
     * @author Francesco Casula <fra.casula@gmail.com>
     */
    class ExceptionListener extends ExceptionHandler
    {
        /**
         * @var Logger
         */
        private $logger;
    
        /**
         * @param Logger $logger
         */
        public function __construct(Logger $logger)
        {
            $this->logger = $logger;
        }
    
        /**
         * @return Logger
         */
        public function getLogger()
        {
            return $this->logger;
        }
    
        /**
         * @param GetResponseForExceptionEvent $event
         */
        public function onKernelException(GetResponseForExceptionEvent $event)
        {
            foreach ($this->getLogger()->getHandlers() as $handler) {
                if ($handler instanceof MongoDBHandler) {
                    $handler->pushProcessor(function (array $record) use ($event) {
                        $record['extra']['headers'] = $event->getRequest()->headers->all();
                        return $record;
                    });
    
                    break;
                }
            }
        }
    }
    
    0 讨论(0)
提交回复
热议问题