我无法在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中获取记录器以从我的主记录器派生?
答案 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()
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。