我想使用日志模块在Python中每次循环迭代时生成一个新的日志文件。我正在分析for循环中的数据,其中循环的每次迭代都包含一个新对象的信息。我想为每个对象生成一个日志文件。
我查看了日志模块的文档,可以按时间间隔或在日志文件填满时更改日志文件,但我看不到如何使用新名称迭代生成新的日志文件。我提前知道循环中有多少对象。
我想象的伪代码是:
import logging
for target in targets:
logfile_name = f"{target}.log"
logging.basicConfig(format='%(asctime)s - %(levelname)s : %(message)s',
datefmt='%Y-%m/%dT%H:%M:%S',
filename=logfile_name,
level=logging.DEBUG)
# analyse target infomation
logging.info('log target info...')但是,日志记录信息始终附加到目标1的第一个日志文件中。
有没有办法强制在每个循环开始时创建一个新的日志文件?
发布于 2019-06-02 03:06:34
这不一定是最好的答案,但对我的情况有效,只是想把它放在这里供将来参考。我创建了一个函数,如下所示:
def logger(filename, level=None, format=None):
"""A wrapper to the logging python module
This module is useful for cases where we need to log in a for loop
different files. It also will allow more flexibility later on how the
logging format could evolve.
Parameters
----------
filename : str
Name of logfile.
level : str, optional
Level of logging messages, by default 'info'. Supported are: 'info'
and 'debug'.
format : str, optional
Format of logging messages, by default '%(message)s'.
Returns
-------
logger
A logger object.
"""
levels = {"info": logging.INFO, "debug": logging.DEBUG}
if level is None:
level = levels["info"]
else:
level = levels[level.lower()]
if format is None:
format = "%(message)s"
# https://stackoverflow.com/a/12158233/1995261
for handler in logging.root.handlers[:]:
logging.root.removeHandler(handler)
logger = logging.basicConfig(filename=filename, level=level, format=format)
return logger正如您所看到的(您可能需要向下滚动上面的代码才能看到return logger行),我使用的是logging.basicConfig()。我的包中所有记录内容的模块,在文件的开头都有以下内容:
import logging
import other stuff
logger = logging.getLogger()
class SomeClass(object):
def some_method(self):
logger.info("Whatever")
.... stuff在执行循环时,我是这样调用的:
if __name__ == "__main__":
for i in range(1, 11, 1):
directory = "_{}".format(i)
if not os.path.exists(directory):
os.makedirs(directory)
filename = directory + "/training.log"
logger(filename=filename)我希望这对你有帮助。
https://stackoverflow.com/questions/54591352
复制相似问题