python 记录器作为 __main__ 的子级

标签 python logging

我无法在 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/

    相关文章:

    java - 如何将 Spring DEBUG 日志重定向到单独的文件?

    c# - 如何向 C# .NET Core 单元测试添加调试日志记录

    python - CNN : why it is making no difference whether i measure accuracy by logits or softmax layer?

    pyparsing中的python正则表达式

    python - FastAPI 中的中间件,用于为每个请求生成 UUID 并发送到日志

    java - 集中式日志记录 - 跨服务器关联消息

    python - pytorch前向检查输入尺寸错误

    python - 将字符计数转换为标记计数

    python - 如何在 Python 和 C 中使用三角函数在 GMP/MPFR 中获得非常高的精度?

    python - 删除python日志记录中的日志级别打印