1.日志作用
不管是在项目开发还是测试过程中,项目运行一旦出现问题日志信息就非常重要了。日志是定位问题的重要手段,就像侦探人员要根据现场留下的线索来推断案情。
2.日志级别
脚本运行会有很多的情况,比如调试信息、报错异常信息等。日志要根据这些不同的情况来继续分级管理,不然对于排查问题的筛选会有比较大的干扰。日志一般定位的级别如下:
级别 | 何时使用 |
---|---|
debug | 调试信息,也是最详细的日志信息。 |
info | 证明事情按预期工作。 |
warning | 表明发生了一些意外,或者不久的将来会发生问题(如磁盘满了),软件还是在正常工作。 |
error | 由于更严重的问题,软件已不能执行一些功能了。 |
critical | 严重错误,表明软件已不能继续运行了。 |
普通输出直接用info类型,调试的时候用debug类型,如果预计有错误时那么我们就需要用error类型的日志。
3.日志格式
时间+模块+行数+日志具体信息
4.python的logging模块
logging模块包括Logger,Handler,Filter,Formatter四个部分。
名称 | 描述 |
---|---|
Logger | 记录器,用于记录日志。 |
Handler | 处理器,将日志记录发送至合适的路径。 |
Filter | 过滤器,提供了更好的粒度控制,它可以决定输出哪些日志记录。 |
Formatter | 格式化器,指明了最终输出中日志的格式。 |
5.Logger记录器
Logger是一个树形层级结构,在使用接口debug,info,warn,error,critical;使用之前必须创建Logger实例,即创建一个记录器。
如果没有显式的进行创建,则默认创建一个root logger,并应用默认的日志级别(warn),Handler和Formatter。
import logging
import logging
logging.basicConfig(filename='run.log', level=logging.DEBUG)
logging.debug('this is a debug') # 最低级别日志
logging.info('this is a info')
logging.warning('this is a warn')
logging.error('this is a error')
logging.critical('this is a critical') # 最高级别日志
basicConfig 部分参数:
filename 指定日志文件名称。
filemode 指定打开文件的模式,如果指定了filename(如果文件模式未指定,则默认为a)。
format 为处理程序使用指定的格式字符串。
datefmt 使用指定的日期/时间格式。样式如果指定了格式字符串,则使用它来指定,格式字符串的类型
level 将根记录器级别设置为指定级别。
Tips:文件读写模式
w 以写方式打开
W 文件若存在,首先要清空,然后(重新)创建
a 以追加模式打开(从EOF开始,必要时创建新文件)
r+ 以读写模式打开
w+ 以读写模式打开
a+ 以读写模式打开
6.Handler处理器
将日志记录发送至合适的路径,常用的处理器类有三个:
- StreamHandler
将日志记录输出发送到诸如sys.stdout,sys.stderr或任何类似文件流的对象。输出在控制台。 - FileHandler
将日志记录输出发送到磁盘文件,它继承了StreamHandler的输出功能。输出在文件里。 - NullHandler
不做任何格式或输出
7.Filter过滤器
Handlers和Loggers可以使用Filters来完成比级别更复杂的过滤,一般只用于比较特殊的定制化需求。
8.Formatter格式化器
使用Formatter对象设置日志信息显示的规则,结构和内容,默认的时间格式为%Y-%m-%d %H:%M:%S。
格式 | 描述 |
---|---|
%(levelno)s | 打印日志级别的数值 |
%(levelname)s | 打印日志级别名称 |
%(pathname)s | 打印当前执行程序的路径 |
%(filename)s | 打印当前执行程序名称 |
%(funcName)s | 打印日志的当前函数 |
%(asctime)s | 打印日志的时间 |
%(thread)d | 打印线程id |
%(threadName)s | 打印线程名称 |
%(process)d | 打印进程ID |
%(message)s | 打印日志信息 |
logging.basicConfig(filename='run.log', level=logging.DEBUG, format='%(asctime)s %(filename)s[line:%(lineno)d %(levelname)s %(message)s')
9.项目中日志使用方法
logger.conf 日志格式配置文件(使用时去掉备注部分)
[loggers]
keys=root,infoLogger # 创建两个记录器
[logger_root]
level=INFO # 日志显示info级别以上的
handlers=consoleHandler,fileHandler # 控制台和日志文件两种显示方式
[logger_infoLogger]
handlers=consoleHandler,fileHandler # 控制台和日志文件两种显示方式
qualname=infoLogger
propagate=0 # 0表示输出日志,但不往更高级别的日志进行传递,比如不往root logger传递
[handlers]
keys=consoleHandler,fileHandler # 控制台和日志文件两种显示方式
[handler_consoleHandler]
class=StreamHandler
level=INFO
formatter=form02
args=(sys.stdout,)
[handler_fileHandler]
class=FileHandler
level=INFO # 日志文件输出的日志级别
formatter=form01 # 日志格式
args=('../log/ggmzx.log', 'a') # 日志文件路径
[formatters]
keys=form01,form02 # 创建两种日志格式
[formatter_form01]
format=%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s
[formatter_form02]
format=%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s
logger_config.py
import logging.config
conf_file = 'logger.conf'
logging.config.fileConfig(conf_file)
logger = logging.getLogger()
test.py
import logging.config
logger.info('this is a info')