python - 为什么 xlwings 禁止记录到文件

标签 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 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/

相关文章:

python - uwsgi worker 之间的沟通

python:运行外部程序并将输出直接输出到文件并等待完成

python - 在 xlwings 中格式化表格

python - 在 Flask 应用程序中设置和检索环境变量

python - 破解 Jinja2 以从 `utf-8` 而不是 `ascii` 编码?

hadoop - 用于日志分析的 Amazon MapReduce 最佳实践

python - 1 周内修改的文件名列表

python - 使用 xlwings 操作用户表单

python - xlwings可以在后台运行excel吗?

javascript - 如何使用颜色渐变推导出颜色的相对百分比值