Python-logging日志
1.1 日志logging
日志是用来记录用户行为或者代码执行过程
1.1.1 五个级别
默认信息是输出info以上级别内容
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 import logging 2 3 logging.debug("debug message") #排错信息 4 5 logging.info("info message") #正常信息 6 7 logging.warning("warning message") #警告信息 8 9 logging.error("error message") #错误信息 10 11 logging.critical("critical message") #严重错误信息
1.1.2 basicConfig简单的日志格式
- 简单,能做事情相对较少
- 不能解决中文的乱码问题
- 不能同时往文件和屏幕上输出
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 import logging # 引入logging模块 2 3 logging.basicConfig(level=logging.DEBUG, #等级,logging.DEBUG显示DEBUG以上所有级别 4 5 format='%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s: %(message)s', 6 7 datefmt='%a ,%d %b %Y %H:%M:%S', 8 9 filename='test.log', 10 11 filemode='w') 12 13 logging.debug("debug message") #排错信息 14 15 logging.info("info message") #正常信息 16 17 logging.warning("warning message") #警告信息 18 19 logging.error("error message") #错误信息 20 21 logging.critical("critical message") #严重错误信息
1.1.2.1 basicConfig参数说明
filename |
用指定的文件名创建FiledHandler,这样日志会被存储在指定的文件中 |
filemode |
文件打开方式,在指定了filename时使用这个参数,默认值为“a”还可指定为“w” |
format |
指定handler使用的日志显示格式 |
datefmt |
指定日期时间格式 |
level |
设置rootlogger的日志级别 |
stream |
用指定的stream创建StreamHandler。可以指定输出到sys.stderr,sys.stdout或者文件(f=open(‘test.log’,’w’)),默认为sys.stderr。若同时列出了filename和stream两个参数,则stream参数会被忽略。 |
1.1.2.2 Format参数可能用到的格式化串
%(name)s |
Logger的名字 |
%(created)f |
前时间,用UNIX标准的表示时间的浮 点数表示 |
%(levelno)s |
数字形式的日志级别 |
%(relativeCreated)d |
输出日志信息时的,自Logger创建以 来的毫秒数 |
%(levelname)s |
文本形式的日志级别 |
%(asctime)s |
字符串形式的当前时间。默认格式是 “2003-07-08 16:49:45,896”。逗号后面的是毫秒 |
%(pathname)s |
调用日志输出函数的模块完整路径名,可能没有 |
%(thread)d |
线程ID。可能没有 |
%(filename)s |
调用日志输出函数的模块文件名 |
%(threadName)s |
线程名。可能没有 |
%(module)s |
调用日志输出函数的模块名 |
%(process)d |
进程ID。可能没有 |
%(funcName)s |
调用日志输出函数的函数名 |
%(message)s |
用户输出的消息 |
%(lineno)d |
调用日志输出函数的语句所在的代码行 |
|
1.1.2.3 应用
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 import logging 2 3 logging.basicConfig(level=logging.DEBUG, 4 5 format='%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s: %(message)s', 6 7 datefmt='%a ,%d %b %Y %H:%M:%S', 8 9 filemode='w') 10 11 try: 12 13 int(input('num>>')) 14 15 except ValueError: 16 17 logging.error("输出的值不是一个数字") 18 num>>a 19 20 Mon ,06 May 2019 15:56:26 - auto.py[line:37] - ERROR: 输出的值不是一个数字
1.1.3 配置log对象
- 些许复杂,能做的事情较多
- 程序充分解耦
- 程序变得高可定制
- 控制台输出
1.1.3.1 例子
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 import logging 2 3 logger = logging.getLogger() #创建一个对象 4 5 sh = logging.StreamHandler() # 创建一个handler,用于输出到控制台 6 7 fh = logging.FileHandler('test2.log',encoding='utf-8') # 创建一个handler,用于写入日志文件 8 9 fomatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') 10 11 12 13 sh.setFormatter(fomatter) 14 15 fh.setFormatter(fomatter) 16 17 18 19 sh.setLevel(logging.WARNING) 20 21 fh.setLevel(logging.INFO) 22 23 24 25 logger.addHandler(sh) 26 27 logger.addHandler(fh) #logger对象可以添加多个fh和sh对象 28 29 30 31 logger.setLevel(logging.DEBUG) 32 33 34 35 logger.debug('你好') # 调试模式 36 37 logger.info('info message') # 基础正常的信息 38 39 logger.warning('warning message') # 警告信息 40 41 logger.error('error message') # 错误信息 42 43 logger.critical('critical message') # 批判的 严重错误 44 2019-05-06 16:12:01,176 - root - WARNING - warning message 45 46 2019-05-06 16:12:01,176 - root - ERROR - error message 47 48 2019-05-06 16:12:01,176 - root - CRITICAL - critical message 49 50 log文件输出 51 2019-05-06 16:12:01,176 - root - INFO - info message 52 2019-05-06 16:12:01,176 - root - WARNING - warning message 53 2019-05-06 16:12:01,176 - root - ERROR - error message 54 2019-05-06 16:12:01,176 - root - CRITICAL - critical message
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 import logging 2 3 logger = logging.getLogger() 4 5 fh = logging.FileHandler('test.log',encoding='utf-8') 6 7 formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') 8 9 #文件操作符 和 格式关联 10 11 fh.setFormatter(formatter) 12 13 #logger对象 和文件操作符 关联 14 15 logger.addHandler(fh) 16 17 logging.debug("debug message") #排错信息 18 19 logging.info("info message") #正常信息 20 21 logging.warning("警告 message") #警告信息 22 23 logging.error("error message") #错误信息 24 25 logging.critical("critical message") #严重错误信息 26 log文件输出 27 2019-05-06 16:11:16,898 - root - WARNING - 警告 message 28 2019-05-06 16:11:16,898 - root - ERROR - error message 29 2019-05-06 16:11:16,898 - root - CRITICAL - critical message
logging库提供了多个组件:Logger、Handler、Filter、Formatter。Logger对象提供应用程序可直接使用的接口,Handler发送日志到适当的目的地,Filter提供了过滤日志信息的方法,Formatter指定日志显示格式。另外,可以通过:logger.setLevel(logging.Debug)设置级别,当然,也可以通过fh.setLevel(logging.Debug)单对文件流设置某个级别。