如何解决无法使用 python 日志记录模块使用单独的类和脚本调用多个记录器
我无法使用两个单独的 python 文件登录到不同的文件。我写了以下日志配置:
{
"version": 1,"formatters": {
"default": {
"class": "logging.Formatter","format": "%(name)s:%(levelname)s:[%(asctime)s]:%(message)s"
}
},"handlers": {
"console": {
"class": "logging.StreamHandler","level": "ERROR","formatter": "default"
},"file": {
"class": "logging.FileHandler","filename": "/data_files/syslogs/generic.log","mode": "a","level": "WARNING","general_email": {
"class": "logging.handlers.SMTPHandler","level": "CRITICAL","mailhost": "smtp.test.com","fromaddr": "test@email.com","toaddrs": "test@email.com","subject": "General: Run Time Error"
},"api_test_email": {
"class": "logging.handlers.SMTPHandler","subject": "API Test: Run Time Error"
},"test_script_email": {
"class": "logging.handlers.SMTPHandler","subject": "Test Script: Run Time Error"
}
},"root": {
"level": "DEBUG","handlers": ["console","file"]
},"loggers": {
"general_logger": {
"level": "DEBUG","propagate": "False","general_email"]
},"api_test_logger": {
"level": "DEBUG","api_test_email"]
},"test_script_logger": {
"level": "DEBUG","test_script_email"]
}
},"disable_existing_loggers": "False"
}
这是 API 文件:
class test_class:
def __init__(self,some_str:str):
self.some_str = some_str
#SETUP LOGGING
with open(f'/log_config.json') as log_file:
log_config_dict = json.load(log_file)
logging.config.dictConfig(log_config_dict)
logging.Formatter.converter = gmtime
logname = date.today().strftime("%Y%m%d")
self.apilogger = logging.getLogger("test_api_logger")
#self.apilogger = logging.getLogger("general_logger")
file_exists = [logname in handler.baseFilename for handler in self.apilogger.handlers if
'FileHandler' in str(type(handler))]
if not file_exists or not file_exists[0]:
# if the logname is not already defined in an existing handler for your logger,we create the filehandler
[self.apilogger.removeHandler(handler) for handler in self.apilogger.handlers if
'FileHandler' in str(type(handler))] # deletes any old file handlers to prevent double-logging
api_file_handler = logging.FileHandler(
f"/Log_Files/test_api/{logname}.log") # creates new filehandler
formatter = logging.Formatter("%(name)s:%(levelname)s:[%(asctime)s]:%(message)s")
api_file_handler.setLevel(logging.DEBUG) # sets log level for new handler
api_file_handler.setFormatter(formatter) # sets handler log format
self.apilogger.addHandler(api_file_handler) # adds new filehandler to the logger
def print_some_str(self):
print(self.some_str)
self.apilogger.info("Function [print_some_str] enabled")
以下是我调用 API 类时正在运行的主脚本。我将它设计为在使用时记录 API,然后在运行时单独记录主脚本。 但我遇到的问题是,当调用主脚本的记录器时,它会停止记录到 API。我不确定我的配置哪里出了问题,因为我为每个文件制作了两个单独的记录器。
def main():
this_str = test_api.test_class("this is a class string")
this_str.print_some_str()
this_str.apilogger.info("API TEST 1")
#SETUP LOGGING
with open(f'/log_config.json') as log_file:
log_config_dict = json.load(log_file)
this_str.apilogger.info("API TEST 2")
logging.config.dictConfig(log_config_dict)
this_str.apilogger.info("API TEST 3")
logging.Formatter.converter = gmtime
logname = date.today().strftime("%Y%m%d")
scriptlogger = logging.getLogger("test_script_logger")
#scriptlogger = logging.getLogger("general_logger")
file_exists = [logname in handler.baseFilename for handler in scriptlogger.handlers if
'FileHandler' in str(type(handler))]
if not file_exists or not file_exists[0]:
# if the logname is not already defined in an existing handler for your logger,we create the filehandler
[scriptlogger.removeHandler(handler) for handler in scriptlogger.handlers if
'FileHandler' in str(type(handler))] # deletes any old file handlers to prevent double-logging
script_file_handler = logging.FileHandler(
f"/Log_Files/test_script/{logname}.log") # creates new filehandler
formatter = logging.Formatter("%(name)s:%(levelname)s:[%(asctime)s]:%(message)s")
script_file_handler.setLevel(logging.DEBUG) # sets log level for new handler
script_file_handler.setFormatter(formatter) # sets handler log format
scriptlogger.addHandler(script_file_handler) # adds new filehandler to the logger
scriptlogger.info("testing script logger")
this_str.print_some_str()
运行测试脚本时,API 记录器的日志文件如下所示:
test_api_logger:INFO:[2021-06-28 19:41:50,422]:Function [print_some_str] enabled
test_api_logger:INFO:[2021-06-28 19:41:50,423]:API TEST 1
test_api_logger:INFO:[2021-06-28 19:41:50,424]:API TEST 2
API 记录器在为脚本记录器调用配置后立即停止,因此永远不会记录“API 测试 3”和对 print_some_str() 的第二次调用。我怀疑我的问题出在我的配置上,但我不确定在脚本中创建处理程序和调用我的记录器哪里出了问题。任何帮助表示赞赏。谢谢。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。