symfony monolog 中通道是如何定义的?

问题描述 投票:0回答:2

我花了几个小时浏览独白文档..但我只是无法弄清楚这个基本问题:独白中如何定义通道?我得到了这个 symfony2 项目,它在

config.yml
文件中有这个:

monolog:
    handlers:
        api:
            type:  stream
            path:  "%kernel.logs_dir%/%kernel.environment%_api_request_raw.log"
            channels: api
            formatter: monolog.formatter.session_api
        api_low:
            type:  stream
            path:  "%kernel.logs_dir%/%kernel.environment%_api_request_low.log"
            channels: api_low
            formatter: monolog.formatter.session_api
        car_location:
            type:  stream
            path:  "%kernel.logs_dir%/car locations/%kernel.environment%_carLocation_not-recognized.log"
            channels: not_recognized
            level: %log_debug_level%
            formatter: monolog.formatter.session_location
        active_request:
            type:  stream
            path:  "%kernel.logs_dir%/%kernel.environment%_api_active_request.log"
            channels: active_request
            level: %log_debug_level%
            formatter: monolog.formatter.session_location
        get_request:
            type:  stream
            path:  "%kernel.logs_dir%/%kernel.environment%_api_get_request.log"
            channels: get_request
            level: %log_debug_level%
            formatter: monolog.formatter.session_location

现在在服务下的同一个文件中我得到了这些:

services:
    monolog.formatter.session_location:
        class: Monolog\Formatter\LineFormatter
        arguments:
            - "[%%datetime%%] %%level_name%%: %%message%%\n"

    monolog.formatter.session_api:
        class: Monolog\Formatter\LineFormatter
        arguments:
            - "[%%datetime%%] %%channel%%.%%level_name%%: %%message%%\n"

基本上自定义了日志消息..足够公平..

理解的是 api_low 是什么意思?它在哪里定义的? api_low 与 api 有何不同?例如,我在这里看到处理程序名称与通道相同(即 api 处理程序有一个 api 通道)..但我不知道该怎么做

如果我简单地放一个

 $logger = $this->get("logger");
 $logger->debug("hello world");

在我的代码中,我在控制台中收到此日志:

[2014-05-16 15:38:15] app.DEBUG: hello world [] []

我也在控制台中看到了这些:

[2014-05-16 15:38:08] request.INFO: Matched route "sonata_admin_dashboard" (parameters: "_controller": "St\AdminBundle\Controller\DashboardController::dashboardAction", "_route": "sonata_admin_dashboard") [] []
[2014-05-16 15:38:08] event.DEBUG: Notified event "kernel.request" to listener "Symfony\Component\HttpKernel\EventListener\LocaleListener::onKernelRequest". [] []
[2014-05-16 15:38:08] event.DEBUG: Notified event "kernel.request" to listener "Symfony\Component\Security\Http\Firewall::onKernelRequest". [] []
[2014-05-16 15:38:08] security.DEBUG: Read SecurityContext from the session [] []
[2014-05-16 15:38:08] security.DEBUG: Reloading user from user provider. [] []
[2014-05-16 15:38:08] doctrine.INFO: MongoDB query: {"find":true,"query":{"_id":{"$id":"51c8c071efe5b8dd09000003"},"type":{"$in":["user","client","partner"]}},"fields":[],"db":"smarttaxi_dev","collection":"User"} [] []
[2014-05-16 15:38:08] doctrine.INFO: MongoDB query: {"limit":true,"limitNum":1,"query":{"_id":{"$id":"51c8c071efe5b8dd09000003"},"type":{"$in":["user","client","partner"]}},"fields":[]} [] []
[2014-05-16 15:38:08] doctrine.INFO: MongoDB query: {"limit":true,"limitNum":1,"query":{"_id":{"$id":"51c8c071efe5b8dd09000003"},"type":{"$in":["user","client","partner"]}},"fields":[]} [] []
[2014-05-16 15:38:08] doctrine.INFO: MongoDB query: {"limit":true,"limitNum":1,"query":{"_id":{"$id":"51c8c071efe5b8dd09000003"},"type":{"$in":["user","client","partner"]}},"fields":[]} [] []
[2014-05-16 15:38:08] security.DEBUG: Username "aiia" was reloaded from user provider. [] []
[2014-05-16 15:38:08] event.DEBUG: Notified event "kernel.request" to listener "FOS\RestBundle\EventListener\BodyListener::onKernelRequest". [] []
[2014-05-16 15:38:08] event.DEBUG: Notified event "kernel

其中一些是显而易见的:学说与相关的东西相匹配,但我只是不知道在哪里可以找到这些东西的定义或参考。

换个方式问: api_low 是一个 monolog 定义的特殊键吗?如果是的话,它的文档在哪里?我在所有代码中找不到该字符串的任何实例,所以我假设它是预定义变量,对吗?

php symfony dependency-injection monolog
2个回答
6
投票

不,

api_low
不是一个特殊的键,它是开发人员定义的键,用于分隔日志(并可能以不同的方式管理它们,例如在不同的 *.log 文件中)。

请参阅有关 Monolog 的食谱如何在服务中使用自定义通道了解更多详细信息。

[编辑:示例]

我假设:

  • config.yml 如您原始帖子中所述
  • 你有一个名为
    MyService
    的服务,它有一个功能
    doSomeStuff()
  • 您熟悉Symfony的服务理念

service.yml

myService.doSomeStuff:
        class: MyProject\MyBundle\Service\MyService
        arguments: [ "@logger"]
        tags:
            - { name: monolog.logger, channel: api_low }

MyService.php

protected $apiLowLogger;    

public function __construct($apiLowLogger)
{
    $this->apiLowLogger = $apiLowLogger;
}

public function doSomeStuff()
{
    $this->apiLowLogger->debug('This debug message will be written in %kernel.logs_dir%/%kernel.environment%_api_request_low.log');
}

要了解不同类型的日志(

debug()
error()
info()
等), 请参阅来源永久链接)。


0
投票

Symfony Monolog Bundle 的工作原理

  1. 通过调用 Monolog Symfony“Logger”服务上的日志记录函数来触发日志,例如
    $logger->info(...)
    /
    $logger->error(...)
    ,被调用的函数决定日志的日志级别,例如'$logger->info(...)' 日志的日志级别为“info”,'$logger->error(...)' 日志的日志级别为“error”。
  2. 此外,“Logger”服务具有特定的“channel”字符串属性集,例如当使用服务类“\Psr\Log\LoggerInterface”作为“$logger”注入时,“app”是默认记录器的默认通道。
  3. 触发的日志由 monolog“处理程序”处理,处理程序在 Symfony 中配置
    monolog.yaml
    在 YAML 属性
    monolog.handlers
    ,每个处理程序都有一个
    type
    一个可选的日志级别和由“level”和“channels”指定的可选通道YAML 属性。
  4. 对于每个处理程序
    type
    ,monolog 有一个 PHP 处理程序类,因此每个处理程序都有自己的业务逻辑,包括日志目标。有些处理程序仅在特定条件下工作,例如“控制台”处理程序仅在代码在 Symfony 命令上下文中运行时输出日志。
  5. 此外,单声道处理程序只会处理来自记录器的日志(如果它与记录器通道匹配)。如果不指定处理程序
    channels
    YAML 属性,来自所有通道的日志将由处理程序处理。如果
    channels
    属性设置为有效的 YAML 数组,则显式设置或排除一个或多个通道,例如
    ['doctrine']
    仅处理
    doctrine
    通道的日志,
    ['!doctrine']
    排除
    doctrine
    通道并处理来自所有其他通道的日志。
  6. 最后,如果处理程序
    log_level
    与日志的日志级别匹配,独白处理程序只会将其“转发”到其目的地。如果不指定 level 属性,则将处理所有日志级别的日志。当设置
    level
    时,monolog 处理程序不仅会转发具有该日志级别的匹配日志,还会转发具有更严重日志级别的日志,例如
    level: warning
    还将记录
    error
    日志。
  7. 要使用默认记录器记录到不同的通道,请在
    monolog.channels
    中的
    monolog.yaml
    下显式添加通道,例如
    channels: ['foo']
    并在自动装配的 Symfony 服务参数前添加通道前缀,例如
    LoggerInterface $fooLogger
    仅登录频道
    foo

确定日志丢失/存在的原因:

  1. 确定您希望处理日志的处理程序,正如所说的某些处理程序仅在某些“条件”下工作,例如控制台处理程序仅适用于 Symfony 命令。
  2. 确定所使用的通道
    $logger
    ,不幸的是没有getter所以我想这需要用调试器来完成。
  3. 确定日志级别以及预期的处理程序是否处理该日志级别。
© www.soinside.com 2019 - 2024. All rights reserved.