【发布时间】:2021-09-25 08:03:19
【问题描述】:
我正在尝试为 python 日志库创建一个包装类。这个想法是,用户可以向构造函数提供记录器的名称,并根据 json 文件的内容配置实例,其中提供的名称是配置文件相应部分的键。
这是我的代码
class LogLib:
def __init__(self, logger_name=""):
conf_dict = Config.get("LogLib")
logging_config.dictConfig(conf_dict)
if not logger_name:
self.logger = logging.getLogger()
else:
self.logger = logging.getLogger(logger_name)
def debug(self, message, db=False):
caller_info = self.get_callerInfo()
msg = message + caller_info
self.logger.debug(msg)
if db:
self.log_db(message, "DEBUG")
def info(self, message, db=False):
caller_info = self.get_callerInfo()
msg = message + caller_info
self.logger.info(msg)
if db:
self.log_db(message, "INFO")
def warning(self, message, db=False):
caller_info = self.get_callerInfo()
msg = message + caller_info
self.logger.warning(msg)
if db:
self.log_db(message, "WARNING")
def error(self, message, db=False, stacktrace=False):
caller_info = self.get_callerInfo()
msg = message + caller_info
self.logger.error(msg, exc_info=stacktrace)
if db:
self.log_db(message, "ERROR")
def critical(self, message, db=False, stacktrace=False):
caller_info = self.get_callerInfo()
msg = message + caller_info
self.logger.critical(msg, exc_info=stacktrace)
if db:
self.log_db(message, "CRITICAL")
def log_db(self, message, level):
raise NotImplemented()
# psql = PostgresqlConnector()
# with psql.create_session() as session:
# psql.insert(session, Log(message=message, level=level))
def get_callerInfo(self):
raw = self.logger.findCaller(stack_info=False)
caller_fileName = raw[0].rsplit("/", 1)[1].split(".")[0]
return f"\nSOURCE > {caller_fileName}.{raw[2]}, Line: {raw[1]}\n"
为了做一些测试,我在类之外的 LogLib 文件底部添加了一个小的 main()。它看起来像这样:
def main():
logger = LogLib(logger_name="db_logger")
logger.debug("Debug test - This should not show up in the file.")
logger.info("Info test")
logger.warning("Warning test")
logger.error("Error test")
if __name__ == "__main__":
main()
为了配置这个包装器,我创建了一个 JSON 格式的配置部分,然后在 _ _ init _ 中获取并使用它。配置如下所示:
"LogLib": {
"version": 1,
"root": {
"handlers": ["console", "file"],
"level": "DEBUG"
},
"db_logger": {
"handlers": ["db_file"],
"level": "INFO"
},
"handlers": {
"console": {
"formatter": "console_formatter",
"class": "logging.StreamHandler",
"level": "WARNING"
},
"file": {
"formatter": "file_formatter",
"class": "logging.FileHandler",
"level": "DEBUG",
"filename": "C:\\Users\\name\\Documents\\GitHub\\proj\\logs\\app_err.log"
},
"db_file": {
"formatter": "file_formatter",
"class": "logging.FileHandler",
"level": "INFO",
"filename": "C:\\Users\\name\\Documents\\GitHub\\proj\\logs\\db.log"
}
},
"formatters": {
"console_formatter": {
"format": "%(asctime)s [%(levelname)s] > %(message)s",
"datefmt": "%d/%m/%Y-%I:%M:%S"
},
"file_formatter": {
"format": "%(asctime)s [%(levelname)s] > %(message)s",
"datefmt": "%d/%m/%Y-%I:%M:%S"
}
}
}
根记录器在其配置方式上工作正常(写入 app_err.log 并打印到给定级别的控制台)但是当我尝试为其提供名称“db_logger”时它不起作用并默认为根无论如何。
我想要的是当用户通过参数“logger_name”向构造函数提供名称时,它应该检查具有该名称的记录器的配置并将为该名称指定的配置应用于 LogLib 实例。在这种情况下,我希望将所有 INFO 或更高级别的日志消息发送到一个名为 db.log 的文件,而不需要任何控制台输出。
我查看了文档并搜索了堆栈溢出,但到目前为止我一直无法理解我做错了什么。在此问题上的任何帮助将不胜感激。 谢谢。
【问题讨论】:
标签: python json logging configuration