我无法在 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()
logger = logger.getLogger(__name__)
在 mypackage.__init__
关于python 记录器作为 __main__ 的子级,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41726427/