我有一个服务负责两个流:a和B。这些流是连接的,但我想在不同的日志文件中记录每个流。你知道吗
我想使用以下配置文件:
[loggers]
keys=root,A,B
[handlers]
keys=file_handler
[formatters]
keys=full
[logger_A]
level=INFO
handlers=fileHandler
[logger_B]
level=INFO
handlers=fileHandler
[logger_root]
level=INFO
handlers=fileHandler
[handler_fileHandler]
class=FileHandler
level=INFO
formatter=full
args=('%(logfilename)s','%(permissions)s','%(encoding)s',)
[formatter_full]
format=[%(asctime)s] [%(levelname)s] --- [%(funcName)s] [P%(process)d][%(threadName)s - %(thread)d]- %(message)s
datefmt='%Y-%m-%d %H:%M:%S'
据我所知,没有任何方法可以在运行时将这些参数动态地发送到fileHandler,对吧?处理程序对所有记录器具有相同的属性,不同的是记录器写入的目标文件。你知道吗
我考虑过配置一个函数,该函数将获取记录器名称和目标文件作为输入,并将记录器返回给我—这是Logging to two files with different settings中建议的:
import logging
def getLoggerToFile(loggerName,filePath,fileMode,fileHandler=None,level=logging.INFO):
logger = logging.getLogger(loggerName)
if len(logger.handlers) > 0:
return logger
if(fileHandler is None):
formatter = logging.Formatter('[%(asctime)s] [%(levelname)s] --- [%(funcName)s] '
'[P%(process)d][%(threadName)s - %(thread)d]- %(message)s')
fileHandler = logging.FileHandler(filePath, mode=fileMode)
fileHandler.setFormatter(formatter)
logger.setLevel(level)
logger.addHandler(fileHandler)
return logger
想听听你有没有其他建议,问一个问题:
如果我使用这个函数,并且用相同的logger名称调用这个函数两次,但是使用不同的文件路径,logger将不能同时写入两个不同的文件,对吗?因此,这与创建一个配置文件相同,其中包含2个记录器和每个记录器的一个处理程序/格式化程序。你知道吗
可以使用一个过滤器和两个处理程序来实现这一点。创建一个记录器和两个文件处理程序。为每个处理程序添加一个过滤器,该过滤器只允许消息进入属于该流的文件。您可以使用日志记录上存在的任何信息来决定消息的去向。下面的代码使用了日志方法的
extra
kwarg,但是如果日志中已经存在一些固有的内容,则可以决定不需要的流。以下是文档相关部分的几个链接: FilterObjectsLogRecord attributes相关问题 更多 >
编程相关推荐