您现在的位置是:网站首页> 编程资料编程资料
Django 中使用日志的方法_python_
2023-05-26
309人已围观
简介 Django 中使用日志的方法_python_
1. 日志的意义
日志是个好东西,但却并不是所有人都愿意记,直到出了问题才追悔莫及,长叹一声,当初要是记日志就好了。
但记日志却是个技术活,不能什么都不记,但也不能什么都记。如果记了很多没用的信息,反而给查日志排错的过程增加很多困难。
所以,日志要记录在程序的关键节点,而且内容要简洁,传递信息要准确。要清楚的反应出程序当时的状态,时间,错误信息等。
只有做到这样,我们才能在第一时间找到问题,并且解决问题
开发阶段,所有的问题都可以通过调试,在程序中输出,但项目上线后,会进行统一的错误处理,不能将错误信息暴漏出来,所以最好的方式,就是将程序运行信息存储在日志中
程序上线后,是万万不能没有日志的
2. django 中如何处理日志
Django 使用 Python 内置的 logging 模块处理系统日志,所以,只要掌握了 Python 中的 logging 模块,基本也就能够在 django 中使用日志了
3. Python 中使用日志
这里简单介绍 Python 中 logging 模块的使用,下一章再聊如何在 django 中使用
logging 模块的使用主要包含如下几个方面
- 将日志信息直接输出
- 将日志信息保存到文件中
- 输出变量到日志中
- 更改消息显示格式
- 覆盖日志
- 日志配置
3.1 直接输出日志信息
首先导入 logging 模块,然后在下面选择方法进行日志输出
| 级别 | 何时使用 |
|---|---|
DEBUG | 细节信息,仅当诊断问题时适用。 |
INFO | 确认程序按预期运行。 |
WARNING | 表明有已经或即将发生的意外(例如:磁盘空间不足)。程序仍按预期进行。 |
ERROR | 由于严重的问题,程序的某些功能已经不能正常执行 |
CRITICAL | 严重的错误,表明程序已不能继续执行 |
简单例子
logging.debug('出现了bug') logging.info('一般信息') logging.warning('警告信息以下级别默认不出现') logging.error('出现了错误') logging.critical('严重问题')
日志信息,被直接输出出来,并没有记录到日志中
3.2 设置日志级别
上面的 logging.info('一般信息') 和 logging.debug('出现了bug') 并没有任何输出,原因在于 logging 模块默认只输出 WARNING以上级别(包含 WARNING)
通过 basicConfig 方法更改日志级别
# 更改日志级别 logging.basicConfig(level=logging.INFO) logging.info('一般信息') logging.debug('出现了bug') logging.warning('警告信息以下级别默认不出现') logging.error('出现了错误') logging.critical('严重问题') 
级别 INFO 高于 DEBUG,如果希望 logging.debug 方法生效,需要更改 level 为 logging.DEBUG
3.3 保存日志到文件
实际开发中,日志信息一定要保存到文件的
basicConfig 方法页可以设置日志文件的目录信息
修改案例中第1行代码,添加 filename 参数,设置日志文件目录和名称
logging.basicConfig(filename='0707.log', level=logging.INFO)
打开日志文件,发现乱码了

3.4 设置编码
basicConfig 方法页可以设置日志文件编码
logging.basicConfig(filename='0707.log', encoding='utf-8', level=logging.INFO)
3.5 覆盖日志文件
默认情况下,新的日志内容采用的是追加模式
可以通过 filemode 参数设置覆盖之前的日志内容
logging.basicConfig(filename='0707.log', filemode='w', encoding='utf-8', level=logging.INFO)
basicConfig()被设计为一次性的配置,只有第一次调用会进行操作,随后的调用不会产生有效操作
此段的意思是,当程序启动后,第一次调用上面的方法,会生效,后面如果程序没有重新启动,无论调用多少次,此代码都不会生效
看下面代码
logging.basicConfig(filename='0707.log', filemode='w', encoding='utf-8', level=logging.INFO) logging.info('一般信息') 启动程序,或者修改代码保存时也会热重载,此时日志文件内容就会被覆盖
但在没有重启的情况下,无论上面代码执行多少次,都不会覆盖内容,而是追加
此种模式的意义在于:程序重启后,旧的日志对于我们没有意义的情况
3.6 记录变量到日志
可以使用下面两种方式进行变量的格式化
logging.basicConfig(filename='0707.log', filemode='w', encoding='utf-8', level=logging.INFO) logging.info('采用 %s 的方式输出变量', '%s') logging.info('采用{}的方式输出变量'.format('format')) 3.7 更改显示消息的组成
这是默认情况下日志消息的组成

如果想更改,可以通过 basicConfig 方法的 format 参数设置
logging.basicConfig(format='%(levelname)s:%(message)s', filename='0707.log', filemode='w', encoding='utf-8', level=logging.INFO) logging.info('采用 %s 的方式输出变量', '%s') logging.info('采用{}的方式输出变量'.format('format')) 下面只显示级别和日志内容,没有 root

代码中levelname 和 messageLogRecord 的属性,完整属性列表如下
| args | 此属性不需要用户进行格式化。 | 合并到 msg 以产生 message 的包含参数的元组,或是其中的值将被用于合并的字典(当只有一个参数且其类型为字典时)。 |
|---|---|---|
| asctime | %(asctime)s | 表示人类易读的 LogRecord 生成时间。 默认形式为 ‘2003-07-08 16:49:45,896’ (逗号之后的数字为时间的毫秒部分)。 |
| created | %(created)f | LogRecord 被创建的时间(即 time.time() 的返回值)。 |
| exc_info | 此属性不需要用户进行格式化。 | 异常元组(例如 sys.exc_info)或者如未发生异常则为 None。 |
| filename | %(filename)s | pathname 的文件名部分。 |
| funcName | %(funcName)s | 函数名包括调用日志记录. |
| levelname | %(levelname)s | 消息文本记录级别('DEBUG','INFO','WARNING','ERROR','CRITICAL')。 |
| levelno | %(levelno)s | 消息数字的记录级别 (DEBUG, INFO, WARNING, ERROR, CRITICAL). |
| lineno | %(lineno)d | 发出日志记录调用所在的源行号(如果可用)。 |
| message | %(message)s | 记入日志的消息,即 msg % args 的结果。 这是在发起调用 Formatter.format() 时设置的。 |
| module | %(module)s | 模块 (filename 的名称部分)。 |
| msecs | %(msecs)d | LogRecord 被创建的时间的毫秒部分。 |
| msg | 此属性不需要用户进行格式化。 | 在原始日志记录调用中传入的格式字符串。 与 args 合并以产生 message,或是一个任意对象 (参见 使用任意对象作为消息)。 |
| name | %(name)s | 用于记录调用的日志记录器名称。 |
| pathname | %(pathname)s | 发出日志记录调用的源文件的完整路径名(如果可用)。 |
| process | %(process)d | 进程ID(如果可用) |
| processName | %(processName)s | 进程名(如果可用) |
| relativeCreated | %(relativeCreated)d | 以毫秒数表示的 LogRecord 被创建的时间,即相对于 logging 模块被加载时间的差值。 |
| stack_info | 此属性不需要用户进行格式化。 | 当前线程中从堆栈底部起向上直到包括日志记录调用并引发创建当前记录堆栈帧创建的堆栈帧信息(如果可用)。 |
| thread | %(thread)d | 线程ID(如果可用) |
| threadName | %(threadName)s | 线程名(如果可用) |
比如,修改上面代码,加上 asctime 属性
logging.basicConfig(format='%(levelname)s:%(message)s:%(asctime)s', filename='0707.log', filemode='w', encoding='utf-8', level=logging.INFO)
查看日志

3.8 模块化
上面介绍的方法已经可以为程序配置日志功能了
logging 模块页提供了模块化的方法,通过下面几个组件来配置日志
- 记录器:暴露了应用程序代码直接使用的接口
- 处理器:将日志记录(由记录器创建)发送到适当的目标
- 过滤器:提供了更细粒度的功能,用于确定要输出的日志记录
- 格式器:指定最终输出中日志记录的样式
其实完成的还是上面的功能,只不过可以进行模块化拆分,比如可以创建多个处理器,多个格式器,通过配置的方式进行处理器、格式器的切换
3.8.1 通过 Python 方法配置
提示:
本文由神整理自网络,如有侵权请联系本站删除!
本站声明:
1、本站所有资源均来源于互联网,不保证100%完整、不提供任何技术支持;
2、本站所发布的文章以及附件仅限用于学习和研究目的;不得将用于商业或者非法用途;否则由此产生的法律后果,本站概不负责!
点击排行
本栏推荐
