python loggers作为__main__的子项

时间:2017-01-18 18:05:32

标签: 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')

我在基于the docs的每个文件中使用了logging.getLogger(__name__)。例外是logger.py,我在其中命名记录器__main__,以便它从上到下运行,而不是尝试从隐藏文件中派生所有内容。

当我运行main.py时,它会从logger.py和main.py中正确记录,但是来自otherfile.py的记录器并未从主记录器中正确派生。

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

2 个答案:

答案 0 :(得分:2)

在logger.py中,您正在配置"__main__"记录器。在main.py中使用__name__这一事实让我感到不知所措。由于您要调用python main.py__name__评估为"__main__"。对。

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

python -m mypackage

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

也就是说,logger.py中配置的记录器绝不是otherfile.py中记录器的父记录。该记录器的真正父级称为"mypackage",但您尚未配置它,因此它的日志是不可见的。

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

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

答案 1 :(得分:0)

您可以通过用点(“。”)调用记录器的分隔级别来轻松创建记录器的层次结构。例如,通过调用logging.getLogger('__main__.' + __name__)返回的记录器继承了logging.getLogger('__main__')返回的记录器中的所有属性。此处描述了此行为:https://docs.python.org/2/library/logging.html#module-level-functions