【问题标题】:Python 3.5.2 logger configuration and usagePython 3.5.2 记录器配置和使用
【发布时间】:2016-10-11 11:57:16
【问题描述】:

我是 python 新手,正在尝试在我的简单应用中设置记录器。

这是应用程序结构:

 - checker
      - checking
         - proxy_checker.py
      - custom_threading
         - __init__.py
         - executor_my.py
         - long_task.py
      - tests
      - __init__.py
      - logging_config.ini
      - main.py

我正在尝试设置文件配置记录器 在主模块的checker/__init__.py:

from logging.config import fileConfig

fileConfig('logging_config.ini')

logging_config.ini

[loggers]
keys=root

[handlers]
keys=stream_handler

[formatters]
keys=formatter

[logger_root]
level=DEBUG
handlers=stream_handler

[handler_stream_handler]
class=StreamHandler
level=DEBUG
formatter=formatter
args=(sys.stderr,)

[formatter_formatter]
format=%(asctime)s %(name)-12s %(levelname)-8s %(message)s

并在/checker/custom_threading/exector_my.py中使用它:

import concurrent.futures
import logging

from custom_threading.long_task import LongTask


class MyExecutor(object):
    logger = logging.getLogger(__name__)
    _executor = concurrent.futures.ThreadPoolExecutor(max_workers=500)

    def __init__(self, thread_count, task):
        self._thread_count = thread_count
        self._task = LongTask(task)
        pass

    def start(self):
        self.logger.debug("Launching with thread count: " + str(self._thread_count))

*more irrelevant code*

尝试使用 logger.info / logger.debug。 对于这两个选项我没有收到任何错误,并且没有任何内容登录控制台。我做错了什么?

附:也许我在 Win 10 x64 上运行它也很有用

【问题讨论】:

  • MyExecutor.start()方法是怎么调用的?
  • main.py -> executor = MyExecutor(thread_count, _proxy_checker.check_countries_in_proxylist) executor.start()

标签: python python-3.x logging


【解决方案1】:

我的(可能是错误的 :-) 猜测是您以 python checker/main.py 之类的方式启动脚本,因此未执行 __init__.py 中的日志记录配置。

请看一下这个答案: Why is __init__.py not being called?

此外,您需要确保在getLogger() 之前调用fileConfig()(在导入时执行类主体)。一个可行的设置是在main.py 开头的某处加载配置并在MyExecutor.__init__() 中实例化记录器。

【讨论】:

  • /checker 目录中以python main.py 开始。我也这么认为。那么,根据良好实践,我应该在哪里设置fileConfig('logging_config.ini')?就在main.py 中?而且,只是尝试将其设置为 main.py - 结果相同。
  • 嗯,你能不能试着把__name__里面的__name__也去掉?
  • 更新了答案,需要进行另一项更改。如果这仍然不够,那么最后一条评论也值得一试,但这是更微妙的事情。
  • 是的,我确实尝试过不使用__name__,同样的。还要确保在getLogger() 之前加载了配置
  • 我发现了一件有趣的事情。我在 pycharm 中运行这个项目。在tests 文件夹中-pytest 测试main.py。当我将 pycharm 配置为执行 pytest 测试时,test_main.py 在调用执行程序的方法上执行 assert - 我在控制台中看到了日志。但是,如果我只是在控制台中运行 main.py 或通过 pytest 命令运行测试 - 控制台中没有日志。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-01-28
  • 1970-01-01
  • 2018-10-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-29
相关资源
最近更新 更多