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."

Python的logging模块详解

 

四.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
以上代码执行结果戳这里

相关文章: