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