Monolog:将不同的通道和多个处理程序记录到分组日志文件+专用日志文件中



我在配置Monolog以处理"嵌套记录器"时遇到了一些问题。

我想做的事:

从服务登录到专用文件(每个服务一个)从所有服务登录到一个文件。每个记录器也应由monolog.handlers.console处理。

我为什么要做

每个服务都有逻辑,但可以使用DI中的其他服务。我想知道一个服务到底记录了什么,所以我想要每个服务的专用记录器(带有自定义通道和自定义日志文件)但是当服务依赖于其他服务时,我希望在一个文件中按时间顺序读取日志。

我有什么

app/config.yml:

monolog:
    handlers:
        my_handler:
            type:     stream
            path:     %kernel.logs_dir%/%kernel.environment%.my.log
            level:    info
            handler:  my_bundle_handler

src/My/Bundle/Resources/config/config.yml

services:
    # LOGGERS
    my_logger:
        class: SymfonyBridgeMonologLogger
        arguments: [my_logger]
        calls:
            - [pushHandler, [@monolog.handler.console]]
            - [pushHandler, [@my_bundle_handler]]
        tags:
            - { name: monolog.logger, channel: my_channel}
    # HANDLERS
    my_bundle_handler:
        abstract: true # Without it it will throw exception
        type: group
        members: [my_service_handler]
        channels: ["my_channel"]
        tags:
            - { name: log_handler }
    my_service_handler:
        class: MonologHandlerStreamHandler
        arguments: [%kernel.logs_dir%/%kernel.environment%.my_service.log, 100]
        channels: ["my_channel"]
        tags:
            - { name: log_handler }

它没有按预期工作。它登录到my_service.log,但不登录到my.log

有可能实现我想要的吗?

monlog中的通道可以按照您的要求工作。单日志配置示例

app/config.yml
monolog:
  channels: ['deletion']
  handlers:
    main:
        type:         fingers_crossed
        action_level: error
        handler:      grouped_main
        formatter: "monolog.formatter.request"
        buffer_size: 30
#        if you will set stop_buffering: true - you will get ALL events after first error. It could produce huge logs for console
        stop_buffering: false
#   this is for getsentry.com error catching
    sentry:
        type:  raven
        dsn:   '%sentry_url%'
        level: notice
    # Groups
    grouped_main:
        type:    group
        members: [sentry, streamed_main, streamed_main_brief]
    # Streams
    streamed_main:
        type:  stream
        path:  "%kernel.logs_dir%/%kernel.environment%.log"
    streamed_main_brief:
        type:  stream
        path:  "%kernel.logs_dir%/%kernel.environment%_brief.log"
        formatter: monolog.brief_formatter
    console:
        type: console
        formatter: monolog.console_formatter
    deletion:
         # log deletion related messages
        level:    debug
        type:     stream
        path:     '%kernel.logs_dir%/deletion.log'
        channels: ['deletion']
        formatter: monolog.brief_formatter
services:
    my_service:
        class: MonologProcessorIntrospectionProcessor
        tags:
            - { name: monolog.processor }
    monolog.console_formatter:
        class: SymfonyBridgeMonologFormatterConsoleFormatter
        arguments:
            - "<fg=black;bg=green>[%%datetime%%]</fg=black;bg=green> %%start_tag%%%%message%%%%end_tag%%n"
    monolog.brief_formatter:
        class: MonologFormatterLineFormatter
        arguments:
            - "[%%datetime%%] %%message%%n"
#            default format is
#            - "[%datetime%] %channel%.%level_name%: %message% %context% %extra%n"        

如果你将添加类似的代码

$this->getContainer()->get("logger")->info("Sample info");
$this->getContainer()->get("monolog.logger.deletion")->info("Deletion channel info");
$this->getContainer()->get("monolog.logger.deletion")->error("Deletion channel error");
$this->getContainer()->get("monolog.logger.deletion")->info("Deletion channel info #2");

你会得到3个日志文件与这样的内容

通道日志文件

deletion.log
[2016-11-11 12:43:18] Deletion channel info
[2016-11-11 12:43:18] Deletion channel error
[2016-11-11 12:43:19] Deletion channel info #2

默认env日志文件

dev.log
[2016-11-11 12:43:18] event.DEBUG: Notified event "console.command" to listener "SymfonyComponentHttpKernelEventListenerDebugHandlersListener::configure". [] {"file":"...."}
[2016-11-11 12:43:18] event.DEBUG: Notified event "console.command" to listener "SymfonyBridgeMonologHandlerConsoleHandler::onCommand". [] {"file":"...."}
[2016-11-11 12:43:18] app.INFO: Sample info [] {"file":"..."}
[2016-11-11 12:43:18] deletion.INFO: Deletion channel info [] {"file":"...."}
[2016-11-11 12:43:18] deletion.ERROR: Deletion channel error [] {"...."}

Brief env.log

[2016-11-11 12:43:18] Notified event "console.command" to listener "SymfonyComponentHttpKernelEventListenerDebugHandlersListener::configure".
[2016-11-11 12:43:18] Notified event "console.command" to listener "SymfonyBridgeMonologHandlerConsoleHandler::onCommand".
[2016-11-11 12:43:18] Sample info
[2016-11-11 12:43:18] Deletion channel info
[2016-11-11 12:43:18] Deletion channel error

另外请注意,由于stop_buffering:错误后的错误通知不会出现在dev.log、dev_brief.log中,而是会出现在deletion.log 中

你应该试试sentry——它的伟大产品,他的主人都很酷:)

最新更新