1. loging框架
主要分为4个框架:
Loggers
:可供程序直接调用的接口,app通过调用提供的api来记录日志Handlers
:决定将日志记录分配至正确的目的地Filters
:对日志信息进行过滤, 提供更细粒度的日志是否输出的判断Formatters
:制定最终记录打印的格式布局
2. loging日志级别
主要分为5个级别:
DEBUG
:详细的信息,通常只出现在诊断问题上INFO
:确认一切按预期运行WARNING
:一些意想不到的事情发生了,或表明一些问题在不久的将来会出现(例如:磁盘空间低)。这个软件还能按预期工作。ERROR
:更严重的问题,软件没能执行一些功能CRITICAL
:一个严重的错误,这表明程序本身可能无法继续运行
- 这5个等级,也分别对应5种打日志的方法: debug 、info 、warning 、error 、critical。默认的是WARNING,
当在WARNING或之上时才被跟踪,并被打印
。- 设置要打印的
log
时只需要设置优先级,比如设置打印INFO,那么比INFO优先级高的WARNING/ERROR/CRITICAL都将被打印,即根据Handlers
的设置,将打印:INFO, WARNING, ERROR, CRITICAL
。
3. 输出日志到指定文件
3.1 示例1
# -*- coding:utf-8 -*-
import logging
logging.basicConfig(filename='logfile.log',format='[%(asctime)s-%(filename)s-%(levelname)s:%(message)s]',
level = logging.DEBUG,
filemode='a',
datefmt='%Y-%m-%d %I:%M:%S %p')
def logtest():
logging.error("这是一条error信息的打印")
logging.info("这是一条info信息的打印")
logging.warning("这是一条warn信息的打印")
logging.debug("这是一条debug信息的打印")
if __name__ == '__main__':
logtest()
- 使用
logging.basicConfig
来指定要输出的文件以及log的输出形式、包括时间格式、日志级别等等。
- Filename:指定路径的文件。
- Format:设置log的显示格式(即在文档中看到的格式)。分别是时间+当前文件名+log输出级别+输出的信息
- Level:输出的log级别,优先级比设置的级别低的将不会被输出保存到log文档中
- Filemode: log打开模式
- a:代表每次运行程序都继续写log。即不覆盖之前保存的log信息。
- w:代表每次运行程序都重新写log。即覆盖之前保存的log信息
3.2 示例2
# -*- coding:utf-8 -*-
import logging
# 第一步,创建一个logger
logger = logging.getLogger()
logger.setLevel(logging.INFO) # Log等级总开关
# 第二步,创建一个handler,用于写入日志文件
logfile = './log.txt'
fh = logging.FileHandler(logfile, mode='a') # open的打开模式这里可以进行参考
fh.setLevel(logging.DEBUG) # 输出到file的log等级的开关
# 创建一个handler,用于输出到控制台
ch = logging.StreamHandler()
ch.setLevel(logging.WARNING) # 输出到console的log等级的开关
# 第三步,定义handler的输出格式
formatter = logging.Formatter("%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s: %(message)s")
fh.setFormatter(formatter)
ch.setFormatter(formatter)
# 第四步,将logger添加到handler里面
logger.addHandler(fh)
logger.addHandler(ch)
# 日志
logger.debug('这是 logger debug message')
logger.info('这是 logger info message')
logger.warning('这是 logger warning message')
logger.error('这是 logger error message')
logger.critical('这是 logger critical message')
3.3 日志格式说明
函数:logging.basicConfig(**kwargs)
- 该函数用于为logging日志系统做一些基本配置,方法定义如下:
- 该函数可接收的关键字参数如下:
参数名称 | 描述 |
---|---|
filename | 指定日志输出目标文件的文件名,指定该设置项后日志信息将写入到指定文件,不会被输出到控制台 |
filemode | 指定日志文件的打开模式,默认为’a’。需要注意的是,该选项要在filename指定时才有效 |
format | 指定日志格式字符串(其实就是每一行的开头信息,每一行的后续信息将由后续的logging.info等指定内容填充),即指定日志输出时所包含的字段信息以及它们的顺序(参考文末内容) |
datefmt | 指定日期/时间格式。需要注意的是,该选项要在format中包含时间字段%(asctime)s时才有效 |
level | 指定日志器的日志级别,大于等于该级别的将会被输出 |
stream | 指定日志输出目标stream,如sys.stdout、sys.stderr以及网络stream。需要说明的是,stream和filename不能同时提供,否则会引发 ValueError异常 |
style | Python 3.2中新添加的配置项。指定format格式字符串的风格,可取值为’%’、’{‘和’$’,默认为’%’ |
handlers | Python 3.3中新添加的配置项。该选项如果被指定,它应该是一个创建了多个Handler的可迭代对象,这些handler将会被添加到root logger。需要说明的是:filename、stream和handlers这三个配置项只能有一个存在,不能同时出现2个或3个,否则会引发ValueError异常。 |
-
logging.basicConfig
函数中,可以指定日志的输出格式format,这个参数可以输出很多有用的信息,如下:%(levelno)s
: 打印日志级别的数值%(levelname)s
: 打印日志级别名称%(pathname)s
: 打印当前执行程序的路径,其实就是sys.argv[0]%(filename)s
: 打印当前执行程序名%(funcName)s
: 打印日志的当前函数%(lineno)d
: 打印日志的当前行号%(asctime)s
: 打印日志的时间%(thread)d
: 打印线程ID%(threadName)s
: 打印线程名称%(process)d
: 打印进程ID%(message)s
: 打印日志信息