python 记录器作为 __main__ 的孩子

eri*_*nla 5 python logging

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

-mypackage
  -__init__.py
  -main.py
  -log
    -__init__.py
    -logfile.log
  -src
    -__init__.py
    -logger.py
    -otherfile.py
Run Code Online (Sandbox Code Playgroud)

main.py 的内容是:

import logging
import src.logger
from src.otherfile import Foo

logger = logging.getLogger(__name__)
logger.info('Logging from main')
foo = Foo()
Run Code Online (Sandbox Code Playgroud)

otherfile.py 的内容是:

import logging
class Foo():
    def __init__(self):
        self.logger = logging.getLogger(__name__)
        self.logger.info('Logging from class in otherfile')
Run Code Online (Sandbox Code Playgroud)

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')
Run Code Online (Sandbox Code Playgroud)

logging.getLogger(__name__)根据docs在每个文件中使用。logger.py 是个例外,我将记录器命名为该记录器,__main__以便它自上而下运行,而不是尝试从隐藏文件中获取所有内容。

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

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

dar*_*gua 6

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

这可能会成为一个问题,因为在导入(而不是执行)时,main.py 的记录器不会是"__main__"but "main"。它可以通过固定使您的包可执行文件:重命名main.py__main__.py运行你的包是这样的:

python -m mypackage
Run Code Online (Sandbox Code Playgroud)

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

也就是说,您配置的记录器绝不logger.pyotherfile.py. 该记录器的真正父级被调用,"mypackage"但您尚未对其进行配置,因此它的日志是不可见的。

您有多种选择,您可以配置(设置日志级别、处理程序和格式化程序):

  • 根记录器: logger = logging.getLogger()
  • mypackage 的记录器:logger = logger.getLogger(__name__)mypackage.__init__
  • ...或降低到您希望的粒度级别。