我有一个 python 程序,它利用多处理来提高效率,以及一个为每个进程创建记录器的函数。记录器函数如下所示:
import logging
import os
def create_logger(app_name):
"""Create a logging interface"""
# create a logger
if logging in os.environ:
logging_string = os.environ["logging"]
if logging_string == "DEBUG":
logging_level = loggin.DEBUG
else if logging_string == "INFO":
logging_level = logging.INFO
else if logging_string == "WARNING":
logging_level = logging.WARNING
else if logging_string == "ERROR":
logging_level = logging.ERROR
else if logging_string == "CRITICAL":
logging_level = logging.CRITICAL
else:
logging_level = logging.INFO
logger = logging.getLogger(app_name)
logger.setLevel(logging_level)
# Console handler for error output
console_handler = logging.StreamHandler()
console_handler.setLevel(logging_level)
# Formatter to make everything look nice
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
console_handler.setFormatter(formatter)
# Add the handlers to the logger
logger.addHandler(console_handler)
return logger
我的处理函数是这样的:
import custom_logging
def do_capture(data_dict_access):
"""Process data"""
# Custom logging
LOGGER = custom_logging.create_logger("processor")
LOGGER.debug("Doing stuff...")
但是,无论日志记录环境变量设置成什么,我仍然会在控制台中收到调试日志消息。为什么我的日志记录级别没有生效,对 setLevel() 的调用肯定应该停止记录调试消息?
最佳答案
这是创建记录器对象的简单方法:
import logging
import os
def create_logger(app_name):
"""Create a logging interface"""
logging_level = os.getenv('logging', logging.INFO)
logging.basicConfig(
level=logging_level,
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')
logger = logging.getLogger(app_name)
return logger
讨论
- 无需将"DEBUG" 转换为
logging.DEBUG
,logging
模块可以理解这些字符串。 - 使用
basicConfig
来减轻设置记录器的痛苦。您不需要创建处理程序、设置格式、设置级别……这应该适用于大多数情况。
更新
除了 else if
之外,我发现了为什么您的代码不起作用。考虑你的行:
if logging in os.environ:
这一行不带引号的logging
是指logging
库包。你想要的是:
if 'logging' in os.environ:
关于Python 日志记录 setLevel() 没有生效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39794194/