Python的logging模块详解
作者:尹正杰
版权声明:原创作品,谢绝转载!否则将追究法律责任。
一.日志级别
日志级别指的是产生的日志的事件的严重程度。
设置一个级别后,严重程度低于设置值的日志消息将被忽略。
常见的日志级别及其对应的数值如下所示:
CRITICAL:
对应数值为50,使用critical()方法调用。
ERROR:
对应数值为40,使用error()方法调用
WARNING:
对应数值为30,使用warning()方法调用,该级别为默认级别。
INFO:
对应数值为20,使用info()方法调用。
DEBUG:
对应数值为0,使用debug()方法调用。
NOTSET:
对应数值为0。
二.字符串格式化
%(message)s: 日志消息内容。
The logged message,computed as msg % args.当调用Formatter.format()时设置。
%(asctime)s: actime。
创建LogRecord时的可读时间。默认情况下,它的格式为'2003-08-08 16:49:45,896'(逗号后面的数字是毫秒部分的时间)
%(funcName)s:
函数名。
日志调用所在的函数名。
%(levelname)s:
日志级别名称。
消息的级别名称:'DEBUG','INFO','WARNING','ERROR','CRITICAL'。
%(levelno)s:
日记级别数值。
消息的级别数字:对应DEBUG,INFO,WARNING,ERROR,CRITICAL。
%(lineno)s:
行号。
日志调用所在的源码行号。
%(module)s:
模块。
模块(filename的名字部分)。
%(process)d:
进程ID。
%(thread)d:
线程ID。
%(processName)s:
进程名称。
%(threadName)s:
线程名称。
%(name)s:
logger名称。
三.实战案例
1>.默认级别
1 #!/usr/bin/env python 2 #_*_conding:utf-8_*_ 3 #@author :yinzhengjie 4 #blog:http://www.cnblogs.com/yinzhengjie 5 6 import logging 7 8 FORMAT = '%(asctime)-15s\tThread info: %(thread)d %(threadName)s %(message)s' 9 logging.basicConfig(format=FORMAT) 10 11 logging.info("I am {} years old !".format(20)) #info不显示 12 logging.warning("I am {} years old !".format(26)) #warning为默认级别 13 14 15 16 #以上代码执行结果如下: 17 2019-11-20 11:02:44,759 Thread info: 17076 MainThread I am 26 years old !
2>.指定日志级别
1 #!/usr/bin/env python 2 #_*_conding:utf-8_*_ 3 #@author :yinzhengjie 4 #blog:http://www.cnblogs.com/yinzhengjie 5 6 import logging 7 8 FORMAT = '%(asctime)-15s\tThread info: %(thread)d %(threadName)s %(message)s' 9 logging.basicConfig(format=FORMAT,level=logging.INFO) #指定日志级别为INFO级别,即只要日志级别大于或等于INFO级别的消息都会被打印哟。 10 11 logging.info("I am {} years old !".format(20)) #单一字符串,python推荐使用这种格式化字符串 12 logging.warning("I am %d %s",26,"years old") #C风格格式化 13 14 15 16 #以上代码执行结果如下: 17 2019-11-20 11:13:30,202 Thread info: 17144 MainThread I am 20 years old ! 18 2019-11-20 11:13:30,202 Thread info: 17144 MainThread I am 26 years old
3>.日志级别和格式化字符串扩展
1 #!/usr/bin/env python 2 #_*_conding:utf-8_*_ 3 #@author :yinzhengjie 4 #blog:http://www.cnblogs.com/yinzhengjie 5 6 import logging 7 8 FORMAT = '%(asctime)-15s\tThread info: %(thread)d %(threadName)s %(message)s %(school)s' 9 logging.basicConfig(format=FORMAT,level=logging.INFO) #指定日志级别为INFO级别,即只要日志级别大于或等于INFO级别的消息都会被打印哟。 10 11 d = {"school":"哈佛大学"} 12 logging.info("I am {} 毕业于 ".format(20),extra = d) #单一字符串,python推荐使用这种格式化字符串 13 logging.warning("I am %d 毕业于 %s",26,"years old",extra = d) #C风格格式化 14 15 16 17 #以上代码执行结果如下: 18 2019-11-20 11:19:02,328 Thread info: 4960 MainThread I am 20 毕业于 哈佛大学 19 2019-11-20 11:19:02,328 Thread info: 4960 MainThread I am 26 毕业于 years old 哈佛大学
4>.修改日期格式
1 #!/usr/bin/env python 2 #_*_conding:utf-8_*_ 3 #@author :yinzhengjie 4 #blog:http://www.cnblogs.com/yinzhengjie 5 6 import logging 7 8 FORMAT = '%(asctime)s %(message)s ' 9 10 logging.basicConfig(format=FORMAT,datefmt = "%Y/%m/%d %I:%M:%S") 11 12 logging.warning("This event was logged.") 13 14 15 16 #以上代码执行结果如下: 17 2019/11/20 11:22:24 This event was logged.
5>.输出到文件
1 #!/usr/bin/env python 2 #_*_conding:utf-8_*_ 3 #@author :yinzhengjie 4 #blog:http://www.cnblogs.com/yinzhengjie 5 6 import logging 7 8 FORMAT = '%(asctime)s %(message)s ' 9 10 logging.basicConfig(format=FORMAT,filename="test.log",filemode="w") #filename设置日志文件,filemode设置读写模式 11 12 for _ in range(10): 13 logging.warning("This event was logged.")
四.Logger类
1>.构造logger方法
1 #!/usr/bin/env python 2 #_*_conding:utf-8_*_ 3 #@author :yinzhengjie 4 #blog:http://www.cnblogs.com/yinzhengjie 5 6 import logging 7 8 a = logging.Logger("hello",20) #Logger实例的构建,使用Logger类也行,但推荐使用getLogger函数。但Logger类可以指定Logger初始的日志级别。 9 b = logging.Logger("hello",30) 10 print(a,id(a)) 11 print(b,id(b)) 12 print(a is b) 13 14 m = logging.getLogger("hello") #使用工厂方法返回一个Logger实例,指定name,返回一个名称为name的Logger实例。如果再次使用相同的名字,返回同一个实例。背后使用一个字典保证同一个名称返回同一个实例。 15 n = logging.getLogger("hello") # 16 print(m,id(m)) 17 print(n,id(n)) 18 print(m is n) 19 20 s = logging.getLogger() #未指定name,返回根Logger实例(logging模块加载的时候,会创建一个全局对象root,它是一个RootLogger实例,即root logger,根logger对象的默认级别是WARNING。调用logging.basicConfig来重新调整级别,就是对这个根Logger的级别进行修改)。 21 print(s,id(s))
<Logger hello (INFO)> 2281796100296 <Logger hello (WARNING)> 2281796100360 False <Logger hello (WARNING)> 2281796104072 <Logger hello (WARNING)> 2281796104072 True <RootLogger root (WARNING)> 2281798333384