python——日志模块
当开发完后部署,需要对运行过程中的状态进行记录,方便排查问题;因此,日志是非常有必要的,python中自带的logging模块,可以满足开发中的大部分需求。
日志的类别
日志级别 | 描述 |
---|---|
DEBUG | 最详细的日志信息,典型应用场景是问题诊断 |
INFO | 信息详细程度仅次于DEBUG,通常只记录关键节点信息 |
WARNING | 当某些不期望的事情发生时记录的信息(如,磁盘可用空间较低),但是此时应用程序还是正常运行的 |
ERROR | 由于一个更严重的问题导致某些功能不能正常运行时记录的信息 |
CRITICAL | 当发生严重错误,导致运用程序不能继续运行时记录的信息 |
python中的具体用法
python中的日志是全局模型存在的,新建好了一个日志后,可以根据该日志对应的文件名字在其他脚本中获取,同时可以根据时间、日志数量或大小进行分多文件记录,下面通过代码进行简要的展示。
不分文件
import logging
import os
# 日志记录时的时间格式
message_format = '%(asctime)s %(levelname)s %(pathname)s(line:%(lineno)d) %(message)s'
def getLog(log_path, filename="single.log"):
'''
根据日志文件名称获取日志,如果该日志不存在,则新建一个
'''
# 设计日置级别,格式
log_file = os.path.join(log_path,filename)
logging.basicConfig(level=logging.INFO,format=message_format)
#根据日志名称获取对应日志
log=logging.getLogger(filename)
if not log.handlers: #避免重复加载handler
file= logging.FileHandler(log_file,encoding='utf-8')
file.setFormatter(logging.Formatter(message_format))
log.addHandler(file)
return log
log = getLog(".", "mylog.txt")
log.debug("This is a debug log.")
log.info("This is a info log.")
log.warning("This is a warning log.")
log.error("This is a error log.")
log.critical("This is a critical log.")
保存的内容如下:
2024-04-19 20:04:10,964 INFO /tmp/ipykernel_43817/3086240563.py(line:23) This is a info log.
2024-04-19 20:04:10,965 WARNING /tmp/ipykernel_43817/3086240563.py(line:24) This is a warning log.
2024-04-19 20:04:10,966 ERROR /tmp/ipykernel_43817/3086240563.py(line:25) This is a error log.
2024-04-19 20:04:10,967 CRITICAL /tmp/ipykernel_43817/3086240563.py(line:26) This is a critical log.
其中debug没有打印出来,原因是当前日志级别为INFO,而DEBUG比它小,所以被忽略了。
日志级别排名如下:
-
DEBUG
-
INFO
-
NOTICE
-
WARNING
-
ERROR
-
CRITICAL
-
ALERT
-
EMERGENCY
按时间进行多文件记录
# 日志记录时的时间格式
message_format = '%(asctime)s %(levelname)s %(pathname)s(line:%(lineno)d) %(message)s'
def getTimeLog(log_path, filename="time.log",when="S"):
# 参数when的选择范围如下:
# S - Seconds
# M - Minutes
# H - Hours(默认)
# D - Days
# midnight - roll over at midnight
# W{0-6} - roll over on a certain day; 0 - Monday
log_file = os.path.join(log_path,filename)
logging.basicConfig(level=logging.INFO,format=message_format)
log = logging.getLogger(filename)
if not log.handlers:
file =logging.handlers.TimedRotatingFileHandler(log_file,when=when,encoding='utf-8')
file.setFormatter(logging.Formatter(message_format))
log.addHandler(file)
return log
按文件大小、数量进行多文件记录
message_format = '%(asctime)s %(levelname)s %(pathname)s(line:%(lineno)d) %(message)s'
def getFileSizeLog(log_path, filename="size.log",filesize=100*1024*1024,backupCount=30):
'''
filesize:单个日志文件最大值,单位是bytes,默认100*1024*1024=100M
backupCount:存储拆分文件个数,如果总的容量不够,会删除最开始的日志文件
'''
log_file = os.path.join(log_path,filename)
logging.basicConfig(level=logging.INFO, format=message_format)
log = logging.getLogger(filename)
#定义过滤条件
if not log.handlers:
file=logging.handlers.RotatingFileHandler(log_file,maxBytes=filesize,backupCount=backupCount,encoding='utf-8')
file.setFormatter(logging.Formatter(message_format))
log.addHandler(file)
return log
更全面的Python日志详解请参考:https://www.cnblogs.com/yyds/p/6901864.html
https://www.cnblogs.com/nancyzhu/p/8551506.html