前言:
日志用来记录用户操作、系统运行状态等,是一个系统的重要组成部分。
日志简介
好的日志
了解线上系统的运行状态
快速准确定位线上问题
发现系统瓶颈
预警系统潜在风险
挖掘产品最大价值
坏的日志
对系统的运行状态一知半解,甚至一无所知
系统出现问题无法定位,或者需要花费巨大的时间和精力
无法发现系统瓶颈,不知优化从何做起
无法基于日志对系统运行过程中的错误和潜在风险进行监控和报警
对挖掘用户行为和提升产品价值毫无帮助
python日志级别
DEBUG
调试信息
INFO
有用的信息
WARNING
警告信息 (默认日志级别)
ERROR
错误信息
CRITICAL
严重错误信息
NOTSET
非级别,表示不设置,按照父logger级别来过滤日志
日志级别关系
NOTSET < DEBUG < INFO < WARNING < ERROR < CRITICAL
备注:如果把log的级别设置为INFO, 那么小于INFO级别的日志都不输出, 大于等于INFO级别的日志都输出。也就是说,日志级别越高,打印的日志越不详细。
logging实战
logging模块基础代码
importlogging
logging.debug('-----调试信息[debug]-----')
logging.info('-----有用的信息[info]-----')
logging.warning('-----警告信息[warning]-----')
logging.error('-----错误信息[error]-----')
logging.critical('-----严重错误信息[critical]-----')
由于没有设置日志级别,默认WARNING级别,上述代码输出如下:
WARNING:root:-----警告信息[warning]-----ERROR:root:-----错误信息[error]-----CRITICAL:root:-----严重错误信息[critical]-----Process finished with exit code 0
自定义日志级别
logging.basicConfig(level=logging.DEBUG)
importlogging
logging.basicConfig(level=logging.DEBUG)
logging.debug('-----调试信息[debug]-----')
logging.info('-----有用的信息[info]-----')
logging.warning('-----警告信息[warning]-----')
logging.error('-----错误信息[error]-----')
logging.critical('-----严重错误信息[critical]-----')
自定义日志显示格式
logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s: %(message)s')
importlogging
logging.basicConfig(level=logging.DEBUG,
format='%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s: %(message)s')
logging.debug('-----调试信息[debug]-----')
logging.info('-----有用的信息[info]-----')
logging.warning('-----警告信息[warning]-----')
logging.error('-----错误信息[error]-----')
logging.critical('-----严重错误信息[critical]-----')
format是控制日志格式用的,具体格式包含:
%(levelno)s
打印日志级别的数值
%(levelname)s
打印日志级别名称
%(pathname)s
打印当前执行程序的路径,其实就是sys.argv[0]
%(filename)s
打印当前执行程序名
%(funcName)s
打印日志的当前函数
%(lineno)d
打印日志的当前行号
%(asctime)s
打印日志的时间
%(thread)d
打印线程ID
%(threadName)s
打印线程名称
%(process)d
打印进程ID
%(message)s
打印日志信息
日志输入-文件
importloggingimportos.pathimporttime#第一步: 创建一个logger
logger =logging.getLogger()
logger.setLevel(logging.DEBUG)#设置Log等级
#第二步: 创建一个handler, 用于写入日志文件
rq = time.strftime('%Y%m%d', time.localtime(time.time()))
log_path= os.path.dirname(os.getcwd()) + r'/Logs/'log_name= log_path + rq + '.log'log_file=log_name
fh= logging.FileHandler(log_file, mode='a+')
fh.setLevel(logging.DEBUG)#输入到文件中的bug等级设置
#第三步: 定义handler的输出格式
formatter = logging.Formatter("%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s: %(message)s")
fh.setFormatter(formatter)#第四步: 将logger添加到handler里面
logger.addHandler(fh)#日志
logger.debug('-----调试信息[debug]-----')
logger.info('-----有用的信息[info]-----')
logger.warning('-----警告信息[warning]-----')
logger.error('-----错误信息[error]-----')
logger.critical('-----严重错误信息[critical]-----')
日志输出-控制台
importloggingimportos.pathimporttime#第一步: 创建一个logger
logger =logging.getLogger()
logger.setLevel(logging.DEBUG)#设置Log等级
#第二步: 创建一个handler, 用于写入日志文件
rq = time.strftime('%Y%m%d', time.localtime(time.time()))
log_path= os.path.dirname(os.getcwd()) + r'/Logs/'log_name= log_path + rq + '.log'log_file=log_name
fh= logging.FileHandler(log_file, mode='a+')
fh.setLevel(logging.DEBUG)#输入到文件中的bug等级设置
#用于打印日志至控制台
ch =logging.StreamHandler()
ch.setLevel(logging.WARNING)#第三步: 定义handler的输出格式
formatter = logging.Formatter("%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s: %(message)s")
fh.setFormatter(formatter)
ch.setFormatter(formatter)#第四步: 将logger添加到handler里面
logger.addHandler(fh)#用于打印日志至控制台
logger.addHandler(ch)#日志
logger.debug('-----调试信息[debug]-----')
logger.info('-----有用的信息[info]-----')
logger.warning('-----警告信息[warning]-----')
logger.error('-----错误信息[error]-----')
logger.critical('-----严重错误信息[critical]-----')
将错误日志记录至文本
importloggingimportos.pathimporttime#第一步: 创建一个logger
logger =logging.getLogger()
logger.setLevel(logging.DEBUG)#设置Log等级
#第二步: 创建一个handler, 用于写入日志文件
rq = time.strftime('%Y%m%d', time.localtime(time.time()))
log_path= os.path.dirname(os.getcwd()) + r'/Logs/'log_name= log_path + rq + '.log'log_file=log_name
fh= logging.FileHandler(log_file, mode='a+')
fh.setLevel(logging.DEBUG)#输入到文件中的bug等级设置
#用于打印日志至控制台
ch =logging.StreamHandler()
ch.setLevel(logging.WARNING)#第三步: 定义handler的输出格式
formatter = logging.Formatter("%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s: %(message)s")
fh.setFormatter(formatter)
ch.setFormatter(formatter)#第四步: 将logger添加到handler里面
logger.addHandler(fh)#用于打印日志至控制台
logger.addHandler(ch)try:
open('/path/to/does/not/exist', 'rb')except(SystemExit, KeyboardInterrupt):raise
exceptException as e:
logger.error('Failed to open file', exc_info=True)
备注
该博客内容来自: