为什么xlwings禁止记录到文件

时间:2018-08-01 11:45:16

标签: python logging xlwings

在我的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子记录(用@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')

1 个答案:

答案 0 :(得分:2)

我对xlwings的工作方式不太熟悉,但是由于logging模块的工作方式很复杂,我建议您不要在模块的全局范围内创建记录器,而是懒惰地-根据需要创建它们。

在许多情况下,在运行任何代码之前 创建在全局范围内创建的日志。然后,其他一些代码将重新配置日志记录,这将导致删除现有的日志并忘记其配置。这就是disable_existing_loggers=False函数(例如https://docs.python.org/2/library/logging.config.html#logging.config.fileConfig)存在logging.config自变量的原因。

要查看是否是这种情况,我建议将您的日志定义代码移至某个函数,然后根据需要调用它,例如:

导入日志记录

# 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')

应该注意,这不是使用日志记录的“最干净”的方法(通常不需要这样做),但是如果问题确实出在日志记录配置上,则是其他模块混乱了,则可能很难解决。