在我的 app.py
模块中,我设置了一个带有控制台和文件处理程序的记录器,如下所示:
import logging
logger = logging.getLogger('app')
logger.setLevel(logging.DEBUG)
console_handler = logging.StreamHandler()
file_handler = logging.FileHandler('gsam_log.txt')
console_handler.setLevel(logging.INFO)
file_handler.setLevel(logging.INFO)
c_formatter = logging.Formatter('%(name)-12s: %(levelname)-8s %(message)s')
f_formatter = logging.Formatter('%(asctime)s %(name)-12s %(levelname)-8s %(message)s')
console_handler.setFormatter(c_formatter)
file_handler.setFormatter(f_formatter)
logger.addHandler(console_handler)
logger.addHandler(file_handler)
如果我在Python控制台中工作并且我这样做:from app import logger
它会按预期工作 - 打印到控制台和文件。我想使用此记录器从我的 xlwings
subs(用 @xw.sub
装饰)进行记录。但由于某种原因,日志仅发送到控制台,而不发送到文件。下面是来自 test.py
模块的代码,我通过 xlwings 将其导入为 UDF 模块。
from app import logger
import xlwings as xw
@xw.sub
def test():
logger.debug('test')
logger.info('test')
logger.warning('test')
最佳答案
我不太熟悉 xlwings
的工作原理,但由于 logging
模块工作方式的复杂性,我建议不要在您的全局范围内创建记录器模块,而是根据需要延迟创建它们。
在许多情况下,在全局范围内创建的日志是在运行任何代码之前创建的。然后,其他一些代码重新配置日志记录,这会导致删除现有日志并忘记其配置。这就是为什么 logging.config
函数存在 disable_existing_loggers=False
参数(例如 https://docs.python.org/2/library/logging.config.html#logging.config.fileConfig )。
要查看是否是这种情况,我建议将日志定义代码移至函数中,并根据需要调用它,例如:
导入日志记录
# app.py
_logger = None
def get_logger():
global _logger
if _logger is None:
_logger = logging.getLogger('app')
_logger.setLevel(logging.DEBUG)
# ... continue to define your logger ...
return _logger
然后在你的函数中:
from app import get_logger
import xlwings as xw
@xw.sub
def test():
logger = get_logger()
logger.debug('test')
logger.info('test')
logger.warning('test')
应该注意的是,这不是使用日志记录的“最干净”的方式(通常不需要这样做),但如果问题确实是其他模块扰乱了日志记录配置,则可能很难解决。
关于python - 为什么 xlwings 禁止记录到文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51632468/