Python 日志(logging)模块
2015-08-27 21:22
791 查看
对于小型项目而言,大家习惯于使用print语句打印信息到终端进行调试,然而,当项目代码量扩大到了一定级别后,打印调试的方法就显得很凌乱了,更重要的是,当debug完成后,甄别并删除(或注释)调试用的打印语句变得非常令人头痛。而使用日志模块则能很好地解决这些问题。
这些函数都是根据追踪事件的级别和严重程度来命名的。如下所示:
默认的层级是WARNING,即只追踪警告及其以上的事件发生,比如下面的简单的例子:
运行结果:
执行上面的代码,然后打开
这段代码也对如何设置日志层级进行了说明。其实,也可以通过命令行的方式设置:
然后加入下面的代码读到设置好的层级信息:
如果不断运行上面的程序,新的日志将追加到旧的日志之后,这会变得越来越庞大,可以通过下面的方法使新的日志覆盖旧的日志:
运行
除了上面的方法外,也可以使用str.format()和string.Template方法。
输出:
输出:
默认的日期格式是ISO8601,你也可以在
输出:
除此之外,还可以使用
更高级的使用方法请看官方教程 Advanced Logging Tutorial
关注微信公众号IT练功房,分享最新IT资讯,学习编程技能,让我们共同进步!
1. 什么是日志
日志(logging)是在程序运行过程中对发生的事件的追踪、记录。程序开发者们在代码中引入日志模块以指示某种特定事件的发生,而这些事件可以依据重要程度划分为不同的层级,比如一般信息(info),警告(warning),错误(error)等。2. 如何使用日志模块
Python的日志模块提供了一系列的函数用来记录不同的日志信息,包括’debug()’,info(),
warning,
error(),
critical()等,下面的表对不同的函数适用范围做了说明:
任务 | 合适的工具 |
---|---|
打印脚本信息或代码信息到控制台 | print() |
在程序正常运行时发生的报告事件(例如状态监测或故障调查) | logging.info()(或者在诊断时使用logging.debug())输出详细的信息 |
在运行出现问题时发出警告信息 | logging.warning() |
对特定的运行时事件报告错误 | 抛出异常 |
不引发异常的错误报告 | 比如长时间运行的服务器进程中的错误处理程序 |
级别 | 使用场景 |
---|---|
DEBUG | 并且只在调试程序时关心的程序运行详细信息 |
INFO | 确认程序像预期一样工作 |
WARNING | 指示超出预期的事件的发生或未来的将发生的问题 |
ERROR | 由于一些严重的问题,程序不能执行某些特定的函数 |
CRITICAL | 严重的错误,用来指示程序将不能继续运行下去 |
import logging logging.warning('Watch out!') # 将会在终端打印信息 logging.info('I told you so') # 不会打印任何信息
运行结果:
WARNING:root:Watch out!
3.将日志记录到文件中
import logging logging.basicConfig(filename='example.log',level=logging.DEBUG) logging.debug('This message should go to the log file') logging.info('So should this') logging.warning('And this, too')
执行上面的代码,然后打开
example.log文件,将会看到下面的内容:
DEBUG:root:This message should go to the log file INFO:root:So should this WARNING:root:And this, too
这段代码也对如何设置日志层级进行了说明。其实,也可以通过命令行的方式设置:
--log=INFO
然后加入下面的代码读到设置好的层级信息:
numeric_level = getattr(logging, loglevel.upper(), None) if not isinstance(numeric_level, int): raise ValueError('Invalid log level: %s' % loglevel) logging.basicConfig(level=numeric_level, ...)
如果不断运行上面的程序,新的日志将追加到旧的日志之后,这会变得越来越庞大,可以通过下面的方法使新的日志覆盖旧的日志:
logging.basicConfig(filename='example.log', filemode='w', level=logging.DEBUG)
4.从多个模块收集日志信息
下面的代码演示了当你的程序由多个模块组成时管理日志的方法:# myapp.py
import logging import mylib def main(): logging.basicConfig(filename='myapp.log', level=logging.INFO) logging.info('Started') mylib.do_something() logging.info('Finished') if __name__ == '__main__': main()
# mylib.py
import logging def do_something(): logging.info('Doing something')
运行
myapp.py的结果:
INFO:root:Started INFO:root:Doing something INFO:root:Finished
5. 记录变量信息
可以使用格式化字符串的方法记录变量:import logging logging.warning('%s before you %s', 'Look', 'leap!')
除了上面的方法外,也可以使用str.format()和string.Template方法。
6.改变日志格式
import logging logging.basicConfig(format='%(levelname)s:%(message)s', level=logging.DEBUG) logging.debug('This message should appear on the console') logging.info('So should this') logging.warning('And this, too')
输出:
DEBUG:This message should appear on the console INFO:So should this WARNING:And this, too
7. 显示日期时间
在格式化输出信息中引入(asctime)s来显示时间:
import logging logging.basicConfig(format='%(asctime)s %(message)s') logging.warning('is when this event was logged.')
输出:
2010-12-12 11:41:42,612 is when this event was logged.
默认的日期格式是ISO8601,你也可以在
basicConfig中进行改变:
import logging logging.basicConfig(format='%(asctime)s %(message)s', datefmt='%m/%d/%Y %I:%M:%S %p') logging.warning('is when this event was logged.')
输出:
12/12/2010 11:46:36 AM is when this event was logged.
除此之外,还可以使用
time.strftime()来改变时间格式。
更高级的使用方法请看官方教程 Advanced Logging Tutorial
关注微信公众号IT练功房,分享最新IT资讯,学习编程技能,让我们共同进步!
相关文章推荐
- Python动态类型的学习---引用的理解
- Python3写爬虫(四)多线程实现数据爬取
- 垃圾邮件过滤器 python简单实现
- 下载并遍历 names.txt 文件,输出长度最长的回文人名。
- install and upgrade scrapy
- Scrapy的架构介绍
- Centos6 编译安装Python
- 使用Python生成Excel格式的图片
- 让Python文件也可以当bat文件运行
- [Python]推算数独
- Python中zip()函数用法举例
- Python中map()函数浅析
- Python将excel导入到mysql中
- Python在CAM软件Genesis2000中的应用
- 使用Shiboken为C++和Qt库创建Python绑定
- FREEBASIC 编译可被python调用的dll函数示例
- Python 七步捉虫法