python logging模块的简单使用方法
日志记录的重要性
日志是对软件执行时所发生事件的一种追踪方式。软件开发人员对他们的代码添加日志调用,借此来指示某事件的发生。一个事件通过一些包含变量数据的描述信息来描述(比如:每个事件发生时的数据都是不同的)。开发者还会区分事件的重要性,重要性也被称为 等级 或 严重性。利用日志可以将事件分为不同的等级。
日志等级简列如下(以严重性递增):
级别 | 何时使用 |
---|---|
DEBUG | 细节信息,仅当诊断问题时适用 |
INFO | 确认程序按预期运行 |
WARNING | 表明有已经或即将发生的意外(例如:磁盘空间不足)。程序仍按预期进行 |
ERROR | 由于严重的问题,程序的某些功能已经不能正常执行 |
CRITICAL | 严重的错误,表明程序已不能继续执行 |
默认的级别是WARNING
,意味着只会追踪该级别及以上的事件,除非更改日志配置。
所追踪事件可以以不同形式处理。最简单的方式是输出到控制台。另一种常用的方式是写入磁盘文件。
logging模块的基本使用方法
import os
import logging
if __name__ == '__main__':
# 如果不指定filename,将会把信息输出到console控制台。(类似于print的操作)
logging.basicConfig(filename='example.log',format='%(asctime)s %(process)s %(message)s',level=logging.DEBUG)
logging.debug('This is a debug message.')
logging.info('this is a info message.')
logging.warning('this is a warning message.')
logging.warning('this is a warning message, too!')
logging.info('this is a info message. too!')
logging.error('Error')
程序最终会产生example.log的文件,文件中显示的信息如下所示:
2020-07-07 15:59:35,470 12024 This is a debug message.
2020-07-07 15:59:35,470 12024 this is a info message.
2020-07-07 15:59:35,470 12024 this is a warning message.
2020-07-07 15:59:35,471 12024 this is a warning message, too!
2020-07-07 15:59:35,471 12024 this is a info message. too!
2020-07-07 15:59:35,471 12024 Error
进阶使用方式
日志库采用模块化方法,并提供几类组件:记录器、处理程序、过滤器和格式化程序。
-
记录器暴露了应用程序代码直接使用的接口。
-
处理器将日志记录(由记录器创建)发送到适当的目标。
-
过滤器提供了更精细的附加功能,用于确定要输出的日志记录。
-
格式器指定最终输出中日志记录的样式。
日志事件信息在 LogRecord 实例中的记录器、处理程序、过滤器和格式化程序之间传递。
# 同时输出到文件和屏幕. 可以在多个模块中logging
import logging
# set up logging to file - see previous section for more details
logging.basicConfig(level=logging.DEBUG,
format='%(asctime)s %(name)-12s %(levelname)-8s %(message)s',
datefmt='%m-%d %H:%M',
filename='myapp.log',
filemode='w') # filemode默认为a,追加信息到日志文件,指定为‘w',重新写入 文件,之前的文件信息丢失
# 定义一个handler来将信息输出到控制台,StreamHandler与FileHandler
console = logging.StreamHandler()
console.setLevel(logging.INFO)
# 设置在控制台输出格式
formatter = logging.Formatter('%(name)-12s: %(levelname)-8s %(message)s')
console.setFormatter(formatter)
# 将handler加入到根记录器
logging.getLogger('').addHandler(console)
# 根记录器输出信息
logging.info('this is an info message.')
#定义其他的记录器输出信息
logger1 = logging.getLogger('myapp.area1')
logger2 = logging.getLogger('myapp.area2')
logger1.debug('logger1 debug.')
logger1.info('logger1.info.')
logger2.warning('logger2 warning.')
logger2.error('logger2 error.')