我有一个PyQt表单,该表单根据单击的按钮运行多个进程。所有过程都是同一模块中类的一部分。
我已经导入了带有setup_logging
函数的单独模块,该函数创建了basicConfig
和StreamHandler
属性。
我的挑战:我需要将每个过程输出到单独的日志文件。
setup_logging代码如下:
def setup_logging(main_file, log_dir='', suffix=''):
if not log_dir:
log_dir = __get_log_dir()
filename = main_file.strip('./')
head, tail = os.path.split(filename)
base_name, extension = os.path.splitext(tail)
if suffix:
suffix = '_' + suffix
log_file = base_name + suffix + time.strftime("-%Y_%m_%d-%H_%M_%S") + '.log'
abs_log_file = os.path.join(log_dir, log_file)
logging.basicConfig(filename=abs_log_file, level=logging.DEBUG,
format='%(asctime)s - %(message)s')
root = logging.getLogger()
console = logging.StreamHandler()
console.setLevel(logging.INFO)
formatter = logging.Formatter('%(message)s')
console.setFormatter(formatter)
root.addHandler(console)
return abs_log_file
一个示例调用如下:
def my_function(self):
setup_logging(__file__, log_dir=logfile_path), suffix='My_Function')
logger = logging.getLogger('My_Function')
... [more code]
[need to shut down the logger here]
对于我的困境,以下情况并不令人鼓舞:
记录器从不直接实例化,而是始终通过模块级函数logging.getLogger(name)实例化。对具有相同名称的getLogger()的多次调用将始终返回对同一Logger对象的引用。 https://docs.python.org/2/library/logging.html
这是真的,我需要“重置”记录器实例并从新的记录器重新开始,但是我还没有找到一种可以“取消实例化”记录器并释放文件以便新实例的方法。当在同一模块中调用不同的过程时,可以初始化记录器的日志并生成新文件。如代码中所述,我试图在每个函数中使用不同的名称调用logging.get_logger()
,但是setup_logging
函数似乎并未创建新文件。
是否可以从一个模块中包含多个记录器文件,或者是否需要为每个进程创建单独的模块?我非常希望不必这样做...