如何配置Monolog使用Symfony2和Doctrine将日志存储到MongoDB中 [英] How to configure Monolog to store logs into MongoDB with Symfony2 and Doctrine

查看:495
本文介绍了如何配置Monolog使用Symfony2和Doctrine将日志存储到MongoDB中的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

是否可以得到一个完整的例子,说明如何配置Monolog可以使用Symfony 2.6和Doctrine 2将其日志存储到MongoDB中?

解决方案

完整配置




/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 %
连接:
默认值:
服务器:%mongodb_server%
选项:
密码:%mongodb_password%
用户名:%mongodb_username%
db:%mongodb_database%
connect:true
log:
服务器:%mongodb_server%
选项:
密码:%mongodb_password%
用户名:%mongodb_username %
db:%mongodb_database%
connect:true
document_managers:
默认值:
auto_mapping:true
日志:
auto_mapping:false
记录:false




/ app /services.yml




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




/app/config_dev.yml



在这个例子中决定将所有内容( debug level)存储在 dev.log 中,只是错误,警告和通知在mongo。




  monolog:
处理程序:
main:
类型:流
路径:%kernel.logs_dir%/%kernel.environment%.log
级别:调试
控制台:
类型:控制台
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:
类型:mongo
级别:注意#根据需要更改
mongo:
id:mongolog
数据库:%mongodb_database%
集合:logs




/app/config_prod.yml




  monolog:
处理程序:
main:
类型:fingers_crossed
action_level:错误
处理程序:mongo
嵌套:
类型:流
路径:%kernel.logs_dir%/%kernel.environment%.log
级别:调试
控制台:
类型:控制台
mongo:
类型:mongo
级别:通知
mongo:
ID:mongolog
数据库:%mongodb_database%
集合:logs
现在让我们触发一个PHP通知,并检查它是否正确地存储在MongoDB中: - )



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



将HTTP请求标头添加到Monolog记录




/app/services.yml




  kernel.listener.exception_listener:
class:AppBundle\EventListener\ExceptionListener
arguments:
- @logger
标签:
- {name:kernel.event_listener,event:kernel.exception,方法:onKernelException}




AppBundle\EventListener\ExceptionListener




 <?php 

命名空间AppBundle\EventListener;

使用Monolog\Handler\MongoDBHandler;
使用Symfony\Bridge\Monolog\Logger;
使用Symfony\Component\Debug\ExceptionHandler;
使用Symfony\Component\HttpKernel\Event\GetResponseForExceptionEvent;

/ **
* Class ExceptionListener
* @package AppBundle\EventListener
* @author Francesco Casula< fra.casula@gmail.com&
* /
class ExceptionListener扩展ExceptionHandler
{
/ **
* @var Logger
* /
private $ logger;

/ **
* @param Logger $ logger
* /
public function __construct(Logger $ logger)
{
$ this - > logger = $ logger;
}

/ **
* @return Logger
* /
public function getLogger()
{
return $这 - >记录器;
}

/ **
* @param GetResponseForExceptionEvent $ event
* /
public function onKernelException(GetResponseForExceptionEvent $ event)
{
foreach($ this-> getLogger() - > getHandlers()as $ handler){
if($ handler instanceof MongoDBHandler){
$ handler-> pushProcessor(function $ record)$($ event){
$ record ['extra'] ['headers'] = $ event-> getRequest() - > headers-> all();
return $ record;
});

break;
}
}
}
}


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?

解决方案

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;
            }
        }
    }
}

这篇关于如何配置Monolog使用Symfony2和Doctrine将日志存储到MongoDB中的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆