【问题标题】:logging not logging from modules不从模块记录日志
【发布时间】:2016-04-27 14:13:36
【问题描述】:

我一直在研究我的代码,也许我被它弄糊涂了。

在我的__main__.py 中进行以下设置:

if args.debug:
    logpath = '{}/ganalytics_mf70.dbg'.format(backend.utilities.get_module_path())
    lvl = logging.DEBUG
else:
    logpath = '{}/ganalytics_mf70.log'.format(backend.utilities.get_module_path())
    lvl = logging.INFO


log = logging.getLogger('GAnalytics')
log.setLevel(logging.DEBUG)

formatter = logging.Formatter('%(asctime)s: %(name)-12s: %(levelname)-8s %(message)s')
fh = logging.FileHandler(logpath) # file logging
fh.setLevel(lvl)
fh.setFormatter(formatter)

formatter = logging.Formatter('%(name)-12s: %(levelname)-8s %(message)s')
ch = logging.StreamHandler()  # console logging
ch.setFormatter(formatter)
ch.setLevel(logging.INFO)

log.addHandler(ch)
log.addHandler(fh)

所有其他 .py 文件都有

import logging
log = logging.GetLogger(__name__)

在顶部。

包装大纲:

program/
    - backend/
        - foo.py
        - bar.py
        - spam.py
        - __init__.py
    - __main__.py

这会在我的__main__.py 中记录所有log.debug 和更高级别的调用 - 但在spambarfoo__init__ py 文件中没有log 调用。

我没有看到的明显错误在哪里?

【问题讨论】:

    标签: python-3.x logging


    【解决方案1】:

    除非其他模块位于名为 GAnalytics 的顶级包(阅读:sys.path 中列出的某些内容的子目录)下,否则它们不会通过您在 __main__.py 中配置的记录器,因此它们的日志事件默认情况下会删除低于 WARNING 的内容。

    大多数时候,您希望更改由logging.getLogger() 给出的根记录器(不带参数,或带参数None)。使用logging.basicConfig() 最容易做到这一点,但您也可以手动完成。

    (旁注:您可能不想调用模块__main__.pyimport __main__ 总是表示“导入主模块”(即调用 Python 时使用的模块) 并且永远不要“导入名为__main__.py 的文件”,因此如果__main__.py 实际上不是主模块,您会对结果行为感到非常困惑。具有该名称的文件也不能使用标准@987654333 @guard 因为那个条件总是成立的。)

    【讨论】:

    • 哇哦。我不认为你不能随便把任何名字扔进 GetLogger()。 #whenskimreadingshootsyouinthefoot。
    猜你喜欢
    • 1970-01-01
    • 2017-06-04
    • 2011-10-21
    • 1970-01-01
    • 2011-11-29
    • 2021-11-23
    • 1970-01-01
    • 2020-11-07
    • 2014-02-01
    相关资源
    最近更新 更多