我在main.py
logger = logging.getLogger("__name__")
fh = logging.FileHandler("./log/error.log")
fh.setLevel(logging.WARN)
logger.addHandler(fh)
在我的main.py
中,我正在子模块@staticmethod
中调用一些sub.py
。由于这些是静态的,因此在开始的每种方法中,我都使用main.py
来获取logger = logging.getLogger(__name__)
的记录器(也许您知道一种更好的方式来获取该记录器?目前正在破坏{{1 }}天哪)。
例如,当我使用{ DRY
,然后将其保存为我配置的main.py
文件。它将不发送到控制台,就像我想要的那样。 但是,当我通过logger.error("something went wrong")
方法执行相同的日志记录调用时,它还会发送到控制台(stderr),这不是我想要的。
我在做什么错了?
答案 0 :(得分:1)
将错误级别打印到控制台是默认配置,因此main.py并未配置记录器。
那是因为main.py正在配置一个名叫“ __name__”的记录器。 Sub正在配置一个名为“ main.sub”的记录器(假设使用基本的包结构并执行main.py)。
最快的解决方法是在main.py中更新此行:
logger = logging.getLogger("main")
对logger main.sub的调用将冒泡到logger main并被其处理程序捕获。
您可能仍想在main.py中使用__name__,因为您已经阅读了这是一个好习惯。只有其他模块调用的模块才是这种情况。请记住以下几点:
如果您运行 python main.py :
'__name__' in main.py is still the same
__name__ in main.py resolves to '__main__'
__name__ in sub.py resolves to 'main.sub'
如果您运行 python sub.py :
'__name__' in main.py is still the same
__name__ in main.py resolves to 'main'
__name__ in sub.py resolves to '__main__'