【问题标题】:Python logging - overview of currently installed loggers/handlersPython 日志记录 - 当前安装的记录器/处理程序的概述
【发布时间】:2012-11-05 01:53:13
【问题描述】:

我正在尝试使用代码中的记录器从 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

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

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>

当我从非 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,
        },
    }
}

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

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

【问题讨论】:

  • offtopic:看到美国终于醒悟后围绕问题的活动如何起飞,这很有趣。从现在开始还有两个小时:)

标签: python django logging fluentd


【解决方案1】:

这不是我以前处理过的问题,但Logging Tree 听起来像是您可能正在寻找的东西。你应该阅读Brandon's post 来了解它,但这里有一个输出示例:

<--""
   Level WARNING
   Handler Stream <open file '<stderr>', mode 'w' at ...>
   |
   o<--[cherrypy]
       |
       o<--"cherrypy.access"
       |   Level INFO
       |   Handler Stream <open file '<stdout>', mode 'w' ...>
       |
       o<--"cherrypy.error"
           Level INFO
           Handler Stream <open file '<stderr>', mode 'w' ...>

【讨论】:

  • 这看起来很有趣。我会试一试的。
  • Python 是一种动态语言,您可以自己阅读并挖掘日志模块的内部结构。尤其是因为这看起来像是一个调试问题,并且在所有版本的 python 上工作都没有特别的问题。
【解决方案2】:

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

但是进一步的调试表明,如果你没有明确设置日志级别,它会设置为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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-21
  • 1970-01-01
  • 2019-02-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多