Python 日志记录 - 当前安装的记录器/处理程序的概述

Ric*_*kyA 5 python django logging fluentd

我正在尝试使用代码中的记录器从 Django 项目设置 Fluentd 日志处理程序:

def get_fluentd_logger(name):
    import logging
    from fluent import handler

    logging.basicConfig(level=logging.DEBUG)
    logger = logging.getLogger(name)
    logger.addHandler(handler.FluentHandler(name, host='localhost', port=24224))
    return logger
Run Code Online (Sandbox Code Playgroud)

handler.FluentHandler来自包fluent-logger,我在本地运行fluent

流利的.conf:

<source>
  type forward
  port 24224
</source>

<match **>
  type copy
  <store>
        type stdout
  </store>

  <store>
          type forward
          send_timeout 60s
          recover_wait 10s
          heartbeat_interval 1s
          phi_threshold 8
          hard_timeout 60s

          <server>
            name monitoring
            host 1.2.3.4
            port 24224
            weight 100
          </server>
  </store>
</match>
Run Code Online (Sandbox Code Playgroud)

当我从非 django python 项目运行它时,它工作正常,但是当从 django 调用时,它不执行任何操作。

问题是:有没有办法查看当前安装的记录器及其处理程序,以便我可以调试这种情况?

[编辑]

当从 django 设置完成时,如下所示:

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'formatters': {
        'simple': {
            'format': '%(levelname)s: %(message)s'
        },
    },
    'handlers': {
       'fluentdebug':{
            'level':'DEBUG',
            'class':'fluent.handler.FluentHandler',
            'formatter': 'simple',
            'tag':'foo.bar.baz',
            'host':'localhost',
            'port':24224,
        },
    },
    'loggers': {
        'foo.bar.baz': {
            'handlers': ['fluentdebug'],
            'level': 'DEBUG',
            'propagate': True,
        },
    }
}
Run Code Online (Sandbox Code Playgroud)

它确实有效。然而,我希望能够通过代码执行此操作,因为foo.bar.baz可以采用许多值,并且我不想用 20 个执行完全相同操作的记录器和处理程序来污染此文件。

也许真正的问题是:为什么我不能logging在 Django 执行设置后从代码添加记录器?

Ric*_*kyA 4

我要回答自己,因为如果有人遇到同样的问题,就更容易找到。问题似乎出在FluentHandler. 使用 @Thomas 提到的 Brandon 的日志树,我们可以看到记录器已正确添加。

然而,进一步的调试表明,如果您没有显式设置日志级别,它将设置为NotSet. 不知何故,在“普通”Python 中这是可以的并且记录被发出。然而在 Django 中,NotSet级别日志被丢弃。我不知道这是否是标准的 Django 行为,但这引起了很多麻烦。下面是有效的代码:

def get_fluentd_logger(name):
    import logging
    from fluent import handler

    logging.basicConfig(level=logging.DEBUG)
    logger = logging.getLogger(name)
    logger.level = logging.INFO
    handler = handler.FluentHandler(name, host='localhost', port=24224)
    handler.level = logging.INFO
    logger.addHandler(handler)
    return logger
Run Code Online (Sandbox Code Playgroud)