▼点击下方卡片关注我
▲点击上方卡片关注我
基础配置秘笈
logging模块玩起来贼简单,三行代码就能整出个日志记录器:
1
import logging
3
# 配置日志输出格式和级别
4
logging.basicConfig(
5
level=logging.INFO,
6
format='%(asctime)s - %(levelname)s - %(message)s'
7
)
9
# 开始记录日志
10
logging.info('程序启动啦!')
11
logging.warning('磁盘空间有点紧张...')
12
logging.error('数据库连接失败!')
运行效果:
1
2024-10-29 10:23:45,123 - INFO - 程序启动啦!
2
2024-10-29 10:23:45,124 - WARNING - 磁盘空间有点紧张...
3
2024-10-29 10:23:45,125 - ERROR - 数据库连接失败!
⚠️ 小贴士:
basicConfig要在第一次调用logging相关方法前配置,不然就不生效了
format里的时间格式可以自定义,比如
%Y-%m-%d %H:%M:%S
默认日志级别是WARNING,低于这个级别的日志不会输出
日志级别大揭秘
日志级别说白了就是信息的重要程度,从低到高依次是:
DEBUG:调试信息,写着玩的
INFO:正常信息,值得记一笔
WARNING:警告信息,要注意了
ERROR:错误信息,出事了
CRITICAL:严重错误,完蛋了
logging.debug(‘这条信息只有调试时才看得到’) logging.info(‘用户小明登录成功’) logging.warning(‘内存使用率超过80%’) logging.error(‘无法连接redis’) logging.critical(‘系统崩溃!’)
日志输出到文件
控制台日志看着不够劲?整个文件输出:
1
import logging
3
logging.basicConfig(
4
filename='app.log',
5
filemode='a', # a是追加模式,w是覆盖模式
6
level=logging.INFO,
7
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s'
8
)
10
logging.info('这条日志写到文件里了')
⚠️ 小贴士:
filemode默认是’a’,也就是追加模式
文件路径最好用绝对路径,避免运行时找不到文件
记得定期清理日志文件,别把硬盘写满了
自定义Logger
想要更细粒度的控制?来整个自定义Logger:
1
import logging
3
# 创建Logger对象
4
logger = logging.getLogger('my_app')
5
logger.setLevel(logging.DEBUG)
7
# 创建控制台处理器
8
console_handler = logging.StreamHandler()
9
console_handler.setLevel(logging.INFO)
11
# 创建文件处理器
12
file_handler = logging.FileHandler('app.log')
13
file_handler.setLevel(logging.ERROR)
15
# 设置日志格式
16
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
17
console_handler.setFormatter(formatter)
18
file_handler.setFormatter(formatter)
20
# 添加处理器
21
logger.addHandler(console_handler)
22
logger.addHandler(file_handler)
24
# 开始使用
25
logger.debug('调试信息') # 不会输出
26
logger.info('普通信息') # 只输出到控制台
27
logger.error('错误信息') # 同时输出到控制台和文件
⚠️ 小贴士:
不同的handler可以设置不同的日志级别
记得给handler设置formatter,不然日志格式会很难看
logger的级别要低于handler的级别,不然日志会被直接过滤掉
实战应用
写个函数计算成绩,顺便记录一下关键信息:
1
import logging
3
logging.basicConfig(level=logging.INFO)
4
logger = logging.getLogger('grade_calculator')
6
def calculate_grade(score):
7
logger.info(f'开始计算成绩,得分: {score}')
9
try:
10
if not isinstance(score, (int, float)):
11
raise TypeError('成绩必须是数字')
13
if score < 0 or score > 100:
14
raise ValueError('成绩必须在0-100之间')
16
if score >= 90:
17
grade = 'A'
18
elif score >= 80:
19
grade = 'B'
20
elif score >= 70:
21
grade = 'C'
22
elif score >= 60:
23
grade = 'D'
24
else:
25
grade = 'F'
27
logger.info(f'成绩计算完成,等级: {grade}')
28
return grade
30
except Exception as e:
31
logger.error(f'计算成绩时出错: {str(e)}')
32
raise
有了日志记录,debug问题的时候就不用到处print了,直接翻日志就知道程序在哪出问题。而且等你的程序上线后,有了日志才能知道用户在用你的程序时遇到了啥问题。
日志记录就是这么回事,掌握这些基本就够用了。要是想整点高级的,还可以研究下RotatingFileHandler(按大小分割日志文件)和TimedRotatingFileHandler(按时间分割日志文件)。
记住,好的日志记录习惯能让你少掉很多头发!
往期回顾
点赞分享
让钱和爱流向你