12.实现日志流处理
1.简要处理流程
1、创建一个logger2、设置下logger的日志的等级3、创建合适的Handler(FileHandler要有路径)4、设置下每个Handler的日志等级5、创建下日志的格式6、向Handler中添加上面创建的格式7、将上面创建的Handler添加到logger中8、打印输出logger.debug\logger.info\logger.warning\logger.error\logger.critical
2.简要实现
import logging# 创建logger,如果参数为空则返回root logger
logger = logging.getLogger("nick")
logger.setLevel(logging.DEBUG) # 设置logger日志等级# 创建handler
fh = logging.FileHandler("test.log", encoding="utf-8")
ch = logging.StreamHandler()# 设置输出日志格式
formatter = logging.Formatter(fmt="%(asctime)s %(name)s %(filename)s %(message)s",datefmt="%Y/%m/%d %X"
)# 注意 logging.Formatter的大小写# 为handler指定输出格式,注意大小写
fh.setFormatter(formatter)
ch.setFormatter(formatter)# 为logger添加的日志处理器
logger.addHandler(fh)
logger.addHandler(ch)# 输出不同级别的log
logger.warning("泰拳警告")
logger.info("提示")
logger.error("错误")
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NKAqMXOp-1651133988171)(BEC0411CE79F43DCB15D5B057138B7F0)]
2.重复日志问题
python logging 重复写日志问题
用Python的logging模块记录日志时,可能会遇到重复记录日志的问题,第一条记录写一次,第二条记录写两次,第三条记录写三次原因:没有移除handler 解决:在日志记录完之后removeHandler
问题复现
import loggingdef log(msg):# 创建logger,如果参数为空则返回root loggerlogger = logging.getLogger("nick")logger.setLevel(logging.DEBUG) # 设置logger日志等级# 创建handlerfh = logging.FileHandler("test.log",encoding="utf-8")ch = logging.StreamHandler()# 设置输出日志格式formatter = logging.Formatter(fmt="%(asctime)s %(name)s %(filename)s %(message)s",datefmt="%Y/%m/%d %X")# 为handler指定输出格式fh.setFormatter(formatter)ch.setFormatter(formatter)# 为logger添加的日志处理器logger.addHandler(fh)logger.addHandler(ch)# 输出不同级别的loglogger.info(msg)log("泰拳警告")
log("提示")
log("错误")

分析:可以看到输出结果有重复打印原因:第二次调用log的时候,根据getLogger(name)里的name获取同一个logger,而这个logger里已经有了第一次你添加的handler,第二次调用又添加了一个handler,所以,这个logger里有了两个同样的handler,以此类推,调用几次就会有几个handler。
3.重复日志问题解决方案1
添加removeHandler语句import logging
def log(msg):#创建logger,如果参数为空则返回root loggerlogger = logging.getLogger("nick")logger.setLevel(logging.DEBUG) #设置logger日志等级#创建handlerfh = logging.FileHandler("test.log",encoding="utf-8")ch = logging.StreamHandler()#设置输出日志格式formatter = logging.Formatter(fmt="%(asctime)s %(name)s %(filename)s %(message)s",datefmt="%Y/%m/%d %X")#为handler指定输出格式fh.setFormatter(formatter)ch.setFormatter(formatter)#为logger添加的日志处理器logger.addHandler(fh)logger.addHandler(ch)# 输出不同级别的loglogger.info(msg)#解决方案1,添加removeHandler语句,每次用完之后移除Handlerlogger.removeHandler(fh)logger.removeHandler(ch)log("泰拳警告")
log("提示")
log("错误")
4.重复日志问题解决方案2
判断获取到的logger实例是否已存在存在就直接使用不存在就添加import logging
def log():#创建logger,如果参数为空则返回root loggerlogger = logging.getLogger("nick")logger.setLevel(logging.DEBUG) #设置logger日志等级#这里进行判断,如果logger.handlers列表为空,则添加,否则,直接去写日志if not logger.handlers:#创建handlerfh = logging.FileHandler("test.log",encoding="utf-8")ch = logging.StreamHandler()#设置输出日志格式formatter = logging.Formatter(fmt="%(asctime)s %(name)s %(filename)s %(message)s",datefmt="%Y/%m/%d %X")#为handler指定输出格式fh.setFormatter(formatter)ch.setFormatter(formatter)#为logger添加的日志处理器logger.addHandler(fh)logger.addHandler(ch)return logger #直接返回loggerlogger = log()
logger.warning("泰拳警告")
logger.info("提示")
logger.error("错误")
logger.debug("查错")
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
