解决RootLogger无setlevel属性错误及logger函数跨函数使用方法咨询
问题解决与使用指南
错误原因
你遇到的AttributeError完全是大小写拼写错误导致的:
- Python是大小写敏感语言,
logging模块的日志级别设置方法是setLevel(),不是setlevel() - 流处理器类是
StreamHandler,不是小写的streamhandler()
修正后的logger函数
import logging import sys def logger(): logger = logging.getLogger() logger.setLevel(logging.INFO) # 修正方法名大小写 formatter = logging.Formatter('%(asctime)s %(clientip)-15s %(user)-8s %(message)s') handler = logging.StreamHandler(sys.stdout) # 修正类名大小写 handler.setLevel(logging.INFO) # 修正方法名大小写 handler.setFormatter(formatter) logger.addHandler(handler) return logger
工作机制解析
- 获取根日志器:调用
logging.getLogger()不传入参数时,返回全局根日志器(RootLogger) - 设置日志级别:
setLevel(logging.INFO)规定只输出INFO及更高级别的日志(优先级:DEBUG < INFO < WARNING < ERROR < CRITICAL) - 定义日志格式:Formatter类定义日志输出模板,包含时间戳、客户端IP、用户名、日志内容等自定义字段
- 创建输出处理器:StreamHandler负责将日志输出到指定流,这里设置为标准输出(控制台)
- 绑定配置到日志器:给处理器设置级别和格式后,将其添加到根日志器,后续日志会通过该处理器按指定格式输出
在其他函数中使用
基础用法
直接调用logger()获取日志器实例,使用时通过extra参数传递格式中定义的自定义字段:
def user_login(username, client_ip): log = logger() log.info(f"{username} 登录成功", extra={'clientip': client_ip, 'user': username})
优化建议
如果多次调用logger(),会重复给根日志器添加StreamHandler,导致同一条日志重复输出。可以添加判断逻辑避免重复:
def logger(): logger = logging.getLogger() # 仅当日志器没有绑定处理器时才初始化配置 if not logger.handlers: logger.setLevel(logging.INFO) formatter = logging.Formatter('%(asctime)s %(clientip)-15s %(user)-8s %(message)s') handler = logging.StreamHandler(sys.stdout) handler.setLevel(logging.INFO) handler.setFormatter(formatter) logger.addHandler(handler) return logger
内容的提问来源于stack exchange,提问作者naveen kumarp2911
相关产品推荐
相关产品推荐

