如何配置Monolog使用Symfony2和Doctrine将日志存储到MongoDB中 [英] How to configure Monolog to store logs into MongoDB with Symfony2 and Doctrine
问题描述
是否可以得到一个完整的例子,说明如何配置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屋!