1.简要处理流程
1、创建一个logger
2、设置下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 logging
def log(msg):
# 创建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"
)
# 为handler指定输出格式
fh.setFormatter(formatter)
ch.setFormatter(formatter)
# 为logger添加的日志处理器
logger.addHandler(fh)
logger.addHandler(ch)
# 输出不同级别的log
logger.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 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"
)
#为handler指定输出格式
fh.setFormatter(formatter)
ch.setFormatter(formatter)
#为logger添加的日志处理器
logger.addHandler(fh)
logger.addHandler(ch)
# 输出不同级别的log
logger.info(msg)
#解决方案1,添加removeHandler语句,每次用完之后移除Handler
logger.removeHandler(fh)
logger.removeHandler(ch)
log("泰拳警告")
log("提示")
log("错误")
4.重复日志问题解决方案2
判断获取到的logger实例是否已存在
存在就直接使用
不存在就添加
import logging
def log():
#创建logger,如果参数为空则返回root logger
logger = logging.getLogger("nick")
logger.setLevel(logging.DEBUG) #设置logger日志等级
#这里进行判断,如果logger.handlers列表为空,则添加,否则,直接去写日志
if not logger.handlers:
#创建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"
)
#为handler指定输出格式
fh.setFormatter(formatter)
ch.setFormatter(formatter)
#为logger添加的日志处理器
logger.addHandler(fh)
logger.addHandler(ch)
return logger #直接返回logger
logger = log()
logger.warning("泰拳警告")
logger.info("提示")
logger.error("错误")
logger.debug("查错")