关于 python logging.config.dictConfig 的问题
Problems about python logging.config.dictConfig
最近在研究记录一些消息的logging模块。我想将自定义的日志路径传递给 dict 配置。为了方便调用,我把一些代码封装成一个class.
现在我的问题是当我调用它时,它不起作用。我期望的效果是将消息记录到控制台和 /tmp/xxxx.log.
这是代码。(抱歉我的英语不好)
#!/usr/bin/env python3
import logging
from logging.config import dictConfig
debug = True
class RequireDebugTrue(logging.Filter):
def filter(self, record):
return debug
logconf_dict = {
'version': 1,
'disable_existing_loggers': False,
'formatters': {
'debug_fmt': {
'format': '[%(asctime)s][%(threadName)s:%(thread)d][%(name)s:'
'%(levelname)s][%(module)s:%(funcName)s(%(lineno)d)]:%(message)s'
},
'prod_fmt': {
'format': '[%(asctime)s][%(name)s:%(levelname)s]'
'[%(module)s:%(funcName)s(%(lineno)d)]:%(message)s'
}
},
'filters': {
'require_debug_true': {
'()': RequireDebugTrue,
}
},
'handlers': {
'console': {
'level': 'DEBUG',
'class': 'logging.StreamHandler',
'formatter': 'debug_fmt',
'filters': ['require_debug_true']
},
'localfile': {
'level': 'DEBUG',
'class': 'logging.handlers.RotatingFileHandler',
'formatter': 'prod_fmt',
'filename': '/tmp/running.log',
'maxBytes': 1024 * 1024 * 5,
'backupCount': 5,
'encoding': 'utf8'
},
},
'loggers': {
'debug_mode': {
'handlers': ['console', 'localfile'],
'level': 'DEBUG',
'propagate': True,
},
'prod_mode': {
'handlers': ['localfile'],
'level': 'DEBUG',
'propagate': True,
},
}
}
class Get_Logger(object):
def __init__(self, logfile, log_handler):
self.log_handler = log_handler
self.logfile = logfile
def get_logger(self):
logconf_dict["handlers"]["localfile"]["filename"] = self.logfile
dictConfig(logconf_dict)
logger = logging.getLogger(self.log_handler)
return logger
if __name__ == '__main__':
logfile = "/tmp/xxxx.log"
logger_obj = Get_Logger("debug_mode", logfile)
logger = logger_obj.get_logger()
logger.debug("This is one test.")
如果我禁用封装代码,直接调用里面的代码,就可以了。像这样的好代码:
logconf_dict["handlers"]["localfile"]["filename"] = "/tmp/xxxx.log"
dictConfig(logconf_dict)
logger = logging.getLogger("debug_mode")
logger.debug("This is one test.")
谁能帮帮我?
解决办法就是改变日志文件和log_handler之间的位置。
错误的代码行:def init(self, logfile, log_handler):
右代码行:def init(self, log_handler, logfile):
我真傻。抱歉打扰了。
最近在研究记录一些消息的logging模块。我想将自定义的日志路径传递给 dict 配置。为了方便调用,我把一些代码封装成一个class.
现在我的问题是当我调用它时,它不起作用。我期望的效果是将消息记录到控制台和 /tmp/xxxx.log.
这是代码。(抱歉我的英语不好)
#!/usr/bin/env python3
import logging
from logging.config import dictConfig
debug = True
class RequireDebugTrue(logging.Filter):
def filter(self, record):
return debug
logconf_dict = {
'version': 1,
'disable_existing_loggers': False,
'formatters': {
'debug_fmt': {
'format': '[%(asctime)s][%(threadName)s:%(thread)d][%(name)s:'
'%(levelname)s][%(module)s:%(funcName)s(%(lineno)d)]:%(message)s'
},
'prod_fmt': {
'format': '[%(asctime)s][%(name)s:%(levelname)s]'
'[%(module)s:%(funcName)s(%(lineno)d)]:%(message)s'
}
},
'filters': {
'require_debug_true': {
'()': RequireDebugTrue,
}
},
'handlers': {
'console': {
'level': 'DEBUG',
'class': 'logging.StreamHandler',
'formatter': 'debug_fmt',
'filters': ['require_debug_true']
},
'localfile': {
'level': 'DEBUG',
'class': 'logging.handlers.RotatingFileHandler',
'formatter': 'prod_fmt',
'filename': '/tmp/running.log',
'maxBytes': 1024 * 1024 * 5,
'backupCount': 5,
'encoding': 'utf8'
},
},
'loggers': {
'debug_mode': {
'handlers': ['console', 'localfile'],
'level': 'DEBUG',
'propagate': True,
},
'prod_mode': {
'handlers': ['localfile'],
'level': 'DEBUG',
'propagate': True,
},
}
}
class Get_Logger(object):
def __init__(self, logfile, log_handler):
self.log_handler = log_handler
self.logfile = logfile
def get_logger(self):
logconf_dict["handlers"]["localfile"]["filename"] = self.logfile
dictConfig(logconf_dict)
logger = logging.getLogger(self.log_handler)
return logger
if __name__ == '__main__':
logfile = "/tmp/xxxx.log"
logger_obj = Get_Logger("debug_mode", logfile)
logger = logger_obj.get_logger()
logger.debug("This is one test.")
如果我禁用封装代码,直接调用里面的代码,就可以了。像这样的好代码:
logconf_dict["handlers"]["localfile"]["filename"] = "/tmp/xxxx.log"
dictConfig(logconf_dict)
logger = logging.getLogger("debug_mode")
logger.debug("This is one test.")
谁能帮帮我?
解决办法就是改变日志文件和log_handler之间的位置。 错误的代码行:def init(self, logfile, log_handler): 右代码行:def init(self, log_handler, logfile): 我真傻。抱歉打扰了。