gpt4 book ai didi

python 记录器作为 __main__ 的子级

转载 作者:行者123 更新时间:2023-12-04 18:28:46 25 4
gpt4 key购买 nike

我无法在 python (2.7) 中正确命名子记录器。我有以下文件结构:

-mypackage
-__init__.py
-main.py
-log
-__init__.py
-logfile.log
-src
-__init__.py
-logger.py
-otherfile.py

main.py 的内容是:
import logging
import src.logger
from src.otherfile import Foo

logger = logging.getLogger(__name__)
logger.info('Logging from main')
foo = Foo()

otherfile.py 的内容是:
import logging
class Foo():
def __init__(self):
self.logger = logging.getLogger(__name__)
self.logger.info('Logging from class in otherfile')

logger.py 的内容是:
import os
import logging
logdir = os.path.dirname(__file__)
logfile = os.path.join(logdir, '../log/controller.log')
logger = logging.getLogger('__main__')
logger.setLevel(logging.DEBUG)

fh = logging.FileHandler(logfile)
fh.setLevel(logging.DEBUG)

formatter = logging.Formatter('%(asctime)s - $(name)s - %(levelname)s: %(message)s')
fh.setFormatter(formatter)

logger.addHandler(fh)

logger.info('logging from logger.py')

我用了 logging.getLogger(__name__)在每个文件中基于 the docs . logger.py 是个异常(exception),我将记录器命名为 __main__。这样它就可以自上而下运行,而不是尝试从隐藏的文件中获取所有内容。

当我运行 main.py 时,它从 logger.py 和 main.py 正确记录,但 otherfile.py 的记录器不是从主记录器正确派生的。

如何让 otherfile.py 中的记录器从我的主记录器派生?

最佳答案

在 logger.py 中,您正在配置 "__main__"记录器。我被以下事实欺骗了,在 main.py 中你使用 __name__ .由于您正在调用 python main.py , __name__计算结果为 "__main__" .对。

这可能会成为一个问题,因为当导入(而不是执行)时,main.py 的记录器不会是 "__main__"但是 "main" .可以通过使您的包可执行来修复它:重命名 main.py__main__.py并像这样运行你的包:

python -m mypackage

这样,记录器名称(实际上是模块 __name__ 的)将保持一致。

也就是说,绝不是您在 logger.py 中配置的记录器。是 otherfile.py 中记录器的父级.该记录器的真正父级称为 "mypackage"但你还没有配置它,所以它的日志是不可见的。

您有多种选择,可以配置(设置日志级别、处理程序和格式化程序):
  • 根记录器:logger = logging.getLogger()
  • mypackage 的记录器:logger = logger.getLogger(__name__)mypackage.__init__
  • ...或降低到您希望的粒度级别。
  • 关于python 记录器作为 __main__ 的子级,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41726427/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com