Python 自定义日志记录处理程序,用于为字典中的每个键创建每个日志文件
Posted
技术标签:
【中文标题】Python 自定义日志记录处理程序,用于为字典中的每个键创建每个日志文件【英文标题】:Python Custom logging handler to create each log file per key in the dictionary 【发布时间】:2021-05-11 03:02:26 【问题描述】:我有一本字典,其中包含一些示例数据,如下所示
"screener": "media", "anchor": "media","reader": "media"
我想为字典中的每个键创建一个日志文件。我计划在流式传输作业中使用此日志记录,它将被流式传输中的每个批次重用。在这里,我也计划使用每个键的旋转文件处理程序。
这是我的sn-p
import logging
from logging.handlers import RotatingFileHandler
import time
logger = logging.getLogger('my_logger')
logger.setLevel(logging.DEBUG)
dict_store = "screener": "media", "anchor": "media", "reader": "media"
dict_log_handler =
def createFileHandler(name):
handler = RotatingFileHandler(name, maxBytes=2000000000, backupCount=10)
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
handler.setFormatter(formatter)
return handler
def runBatch():
print("logging batch")
for name in dict_store.keys():
print(name)
if name in dict_log_handler:
print(f"getting logger from dict_handler name")
handler = dict_log_handler[name]
else:
handler = createFileHandler(name)
dict_log_handler[name] = handler
logger.addHandler(handler)
logger.info('Hello, world!')
logger.info('Hello, world!')
logger.info('Hello, world!')
logger.info('Hello, world!')
logger.info('Hello, world!')
logger.info('Hello, world!')
logger.removeHandler(handler)
time.sleep(0.1)
for i in range(0, 3):
runBatch()
目前正在按预期工作。我只是想在覆盖或创建自定义处理程序中实现类似的东西(比如如果我们传递一个名称,它应该自动执行这些东西)并且总体预期是它不应该影响性能。
问题是,我想将它包装在一个类中并直接使用它。可能吗?
【问题讨论】:
【参考方案1】:您的问题不清楚您到底想做什么,但如果您的想法是使用多个记录器,如您的代码所示,那么您可以执行以下操作:
logging.getLogger(name)
这是用于访问特定记录器的方法,在您的代码中,您使用相同的记录器,但使用addHandler
和removeHandler
切换到特定记录器。
您可以像这样创建多个记录器:
import logging
from logging.handlers import RotatingFileHandler
dict_store = "screener": "media", "anchor": "media", "reader": "media"
for name in dict_store:
logger = logging.getLogger(name)
logger.setLevel(logging.DEBUG)
handler = RotatingFileHandler(name, maxBytes=2000000000, backupCount=10)
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
handler.setFormatter(formatter)
logger.addHandler(handler)
您可以将上述代码包装在您自己的日志记录类/方法中,并根据需要使用它。请记住,这只需要调用一次。
下次可以访问具体的日志,使用记录方法:
logger = logging.getLogger(<logger_name>)
logger.debug("debug")
logger.info("info")
logger.warning("warning")
logger.error("error")
logger.critical("critical")
【讨论】:
"logging.getLogger(name) 这是用于访问特定记录器的方法" 对于普通文件处理程序为 true。但是在旋转文件处理程序的情况下,它使用的是 RotatingFileHandler 方法() 另外你想说的是,“logging.getLogger(以上是关于Python 自定义日志记录处理程序,用于为字典中的每个键创建每个日志文件的主要内容,如果未能解决你的问题,请参考以下文章
如何自定义java日志文件,最多只包含N个日志记录,而不是以字节为单位的大小