日志模块logging的四大组件:

logger: 志类应用程序往往通调用提供api记录志
handler: 志信息处理志发送(保存)同目标域
filter: 志信息进行滤
formatter:志格式化

Logger类:
构造
使用工厂方法返回一个Logger实例。
logging.getLogger([name=None])
指定name,返回一个名称为name的Logger实例。如果再次使用相同的名字,是实例化一个对象。未指定name,返回Logger实例,名称是root,即根Logger。
Logger是层次结构的,使用 '.' 点号分割,如'a'、'a.b'或'a.b.c.d','a'是'a.b'的父parent,a.b是a的子child。对于foo来说,名字为foo.bar、foo.bar.baz、foo.bam都是foo的后代。
举例:

  1. import logging
  2. DATEFMT ="[%Y-%m-%d %H:%M:%S]"
  3. FORMAT = "%(asctime)s %(thread)d %(message)s"
  4. logging.basicConfig(level=logging.INFO,format=FORMAT,datefmt=DATEFMT,filename='class_test.log')
  5.  
  6. root = logging.getLogger()
  7. print(root.name,type(root),root.parent,id(root))
  8.  
  9. logger = logging.getLogger(__name__)
  10. print(logger.name, type(logger), id(logger), id((logger.parent)))
  11.  
  12. logger1 = logging.getLogger(__name__ + ".ok")
  13. print(logger1.name, type(logger1), id(logger1), id((logger1.parent)))
  14.  
  15. print(logger1.parent,id(logger1.parent))
  16.  
  17. 运行结果:
  18. root <class 'logging.RootLogger'> None 4367575248
  19. __main__ <class 'logging.Logger'> 4367575864 4367575248
  20. __main__.ok <class 'logging.Logger'> 4367575920 4367575864
  21. <logging.Logger object at 0x10453eb38> 4367575864

  

子child的级别设置,不影响父parent的级别:

  1. import logging
  2.  
  3. FORMAT = "%(asctime)s %(thread)d %(message)s"
  4. logging.basicConfig(level=logging.WARNING,format=FORMAT,datefmt="[%Y-%m-%d %H:%M:%S]")
  5.  
  6. root = logging.getLogger()
  7. print(1,root,id(root)) #RootLogger,根Logger
  8. root.info('my root') #低于定义的WARNING级别,所以不会记录
  9.  
  10. loga = logging.getLogger(__name__) #Logger继承自RootLogger
  11. print(2,loga,id(loga),id(loga.parent))
  12. print(3,loga.getEffectiveLevel()) #数值形式的有效级别
  13.  
  14. loga.warning('before')
  15. loga.setLevel(28) #设置级别为28
  16. print(4,loga.getEffectiveLevel())
  17. loga.info('after')#
  18. loga.warning('after1')
  19.  
  20. 运行结果:
  21. [2017-12-17 16:31:20] 4320629568 before
  22. 1 <logging.RootLogger object at 0x104534f28> 4367535912
  23. 2 <logging.Logger object at 0x1044ef630> 4367250992 4367535912
  24. 3 30
  25. 4 28
  26. [2017-12-17 16:31:20] 4320629568 after1

  

Handler:

Handler控制日志信息的输出目的地,可以是控制台、文件。

可以单独设置level

可以单独设置格式

可以设置过滤器

Handler

  StreamHandler #不指定使用sys.strerr

    FileHandler #文件

    _StderrHandler #标准输出

  NullHandler #什么都不做

level的继承:

  1. import logging
  2.  
  3. FORMAT = "%(asctime)s %(thread)d %(message)s"
  4. logging.basicConfig(level=logging.INFO,format=FORMAT,datefmt="[%Y-%m-%d %H:%M:%S]")
  5.  
  6. root = logging.getLogger() #根Logger级别为INFO 20
  7. print('root:',root.getEffectiveLevel())
  8.  
  9. log1 = logging.getLogger('s')
  10. log1.setLevel(logging.ERROR) #级别为ERROR 40
  11. print('log1:',log1.getEffectiveLevel())
  12. log1.error('log1 error')
  13.  
  14. log2 = logging.getLogger('s.s1') #继承自log1 40,无法使用warning
  15. log2.setLevel(logging.WARNING) #设置为WARNING 30,才可以使用warning
  16. print('log2:',log2.getEffectiveLevel())
  17. log2.warning('log2 warning')
  18.  
  19. 运行结果:
  20. [2017-12-17 16:52:22] 4320629568 log1 error
  21. root: 20
  22. log1: 40
  23. [2017-12-17 16:52:22] 4320629568 log2 warning
  24. log2: 30

  

logger实例,如果设置了level,就用它和信息的级别比较,否则,继承最近的祖先的level。

handler处理:

  1. import logging
  2.  
  3. FORMAT = "%(asctime)s %(thread)d %(message)s"
  4. logging.basicConfig(level=logging.INFO,format=FORMAT,datefmt="[%Y-%m-%d %H:%M:%S]")
  5.  
  6. root = logging.getLogger()
  7. print(1,root.getEffectiveLevel()) #RootLogger,根Logger
  8.  
  9. log1 = logging.getLogger('s')
  10. print(2,log1.getEffectiveLevel())
  11.  
  12. h1 = logging.FileHandler('test.log')
  13. h1.setLevel(logging.WARNING)
  14. log1.addHandler(h1)
  15. print(3,log1.getEffectiveLevel())
  16.  
  17. log2 = logging.getLogger('s.s2')
  18. print(4,log2.getEffectiveLevel())
  19.  
  20. h2 = logging.FileHandler('test1.log')
  21. h2.setLevel(logging.WARNING)
  22. log1.addHandler(h2)
  23. print(3,log1.getEffectiveLevel())
  24.  
  25. log2.warning('log2 info---')
  26.  
  27. 运行结果:
  28. 1 20
  29. [2017-12-17 19:02:53] 7956 log2 info---
  30. 2 20
  31. 3 20
  32. 4 20
  33. 3 20

  

test.log和test1.log最终都会记录一份"log2 info---"
同样,handler也可以设置使用logging.Formatter()设置格式和Logging.Filter()设置过滤器:

  1. import logging
  2.  
  3. FORMAT = "%(asctime)s %(thread)d %(message)s"
  4. logging.basicConfig(level=logging.INFO,format=FORMAT,datefmt="[%Y-%m-%d %H:%M:%S]")
  5.  
  6. root = logging.getLogger()
  7. print(1,root.getEffectiveLevel()) #RootLogger,根Logger
  8.  
  9. log1 = logging.getLogger('s')#模块化用__module__,函数化用__name__作为Logger名,Logger同名内存中也只有一个
  10. print(2,log1.getEffectiveLevel())
  11.  
  12. h1 = logging.FileHandler('test.log')
  13. h1.setLevel(logging.WARNING)
  14. fmt1 = logging.Formatter('[%(asctime)s] %(thread)s %(threadName)s log1-handler1 %(message)s')
  15. h1.setFormatter(fmt1) #重新个性化定义记录的格式化字符串
  16. log1.addHandler(h1)
  17. filter1 = logging.Filter('s') #过滤器 会记录s, s.s2的信息
  18. log1.addFilter(filter1)
  19. print(3,log1.getEffectiveLevel())
  20.  
  21. log2 = logging.getLogger('s.s2')
  22. print(4,log2.getEffectiveLevel())
  23.  
  24. h2 = logging.FileHandler('test1.log')
  25. h2.setLevel(logging.WARNING)
  26. log1.addHandler(h2)
  27. filter1 = logging.Filter('s.s2') #过滤器不会记录s.s2的消息,只会记录自己的消息
  28. log1.addFilter(filter1)
  29. print(3,log1.getEffectiveLevel())
  30.  
  31. log1.warning('log1 warning===')
  32. log2.warning('log2 warning---')
  33.  
  34. 运行结果:
  35. test.log: #handler1记录了到了log1和log2的信息
  36. [2017-12-17 19:43:12,654] 5872 MainThread log1-handler1 log1 warning===
  37. [2017-12-17 19:43:12,654] 5872 MainThread log1-handler1 log2 warning---

  

test1.log: #handler2只记录了它自己的信息
log2 warning---

参考:https://www.cnblogs.com/i-honey/p/8052579.html

logger类的更多相关文章

  1. 关于Java Logger类的使用问题 - 内存不释放

    原文地址:http://www.ihuxu.com/p/236.html   说明:这是一个利用Java Logger类的示例,完成简单的日志记录功能.代码中有部分类库没有说明,但不影响阅读. 本人技 ...

  2. [Python 模块] logging模块、Logger类

    logging模块: 标准库里面的logging模块,在前面学习线程安全时曾用来解决print被打断的问题,这里会介绍logging模块的功能. logging模块是线程安全的,不需要客户做任何特殊的 ...

  3. Java程序日志:java.util.logging.Logger类

    一.Logger 的级别 比log4j的级别详细,全部定义在java.util.logging.Level里面.各级别按降序排列如下:SEVERE(最高值)WARNINGINFOCONFIGFINEF ...

  4. java Logger 类

    package org.rx.common; import org.slf4j.LoggerFactory; import java.util.Collections; import java.uti ...

  5. 爆料喽!!!开源日志库Logger的剖析分析

    导读 Logger类提供了多种方法来处理日志活动.上一篇介绍了开源日志库Logger的使用,今天我主要来分析Logger实现的原理. 库的整体架构图 详细剖析 我们从使用的角度来对Logger库抽茧剥 ...

  6. java.util.logging.Logger 使用详解

    概述: 第1部分 创建Logger对象 第2部分 日志级别 第3部分 Handler 第4部分 Formatter 第5部分 自定义 第6部分 Logger的层次关系 参考 第1部分 创建Logger ...

  7. Log4j使用教程 log4:WARN No appenders could be found for logger (org.springframework.web.context.ContextLoader).

    1.Logger类 通过Logger类的静态方法Logger.getRootLogger得到RootLogger.所有其他的loggers是通过静态方法Logger.getLogger来实例化并获取的 ...

  8. Log4j源码解析--核心类解析

    原文出处:http://www.blogjava.net/DLevin/archive/2012/06/28/381667.html.感谢上善若水的无私分享. 在简单的介绍了Log4J各个模块类的作用 ...

  9. Logger之简单入门

    Java 中自带的日志系统,今天抽空了解了一点,算是入了门,所以将自己的一些心得记录下来,以备日后查看,有兴趣的朋友,看到此文章,觉得有错误或需要添加的地方,请在下方评论留言,大家可以共同进步,谢谢: ...

随机推荐

  1. xpath的数据和节点类型以及XPath中节点匹配的基本方法

    XPath数据类型  XPath可分为四种数据类型:  节点集(node-set)  节点集是通过路径匹配返回的符合条件的一组节点的集合.其它类型的数据不能转换为节点集.  布尔值(boolean)  ...

  2. UGUI 的多分辨率适配

    1.Canvas的属性配置 2.Canvas Scaler的属性配置 3.根据不同的屏幕的比例动态修改缩放基准 void Start () { float standard_width = 960f; ...

  3. ZooKeeper(五)-- Curator使用

    前言 Curator是Netflix开源的一套ZooKeeper客户端框架: 1.封装ZooKeeper client与ZooKeeper server之间的连接处理; 2.提供了一套Fluent风格 ...

  4. 线程间通信:Queue

    线程间使用队列来互相交换数据,数据可以是字符串 .列表 .元组等,Queue 是提供队列操作的模块,常见的队列如下: FIFO:First In First Out 先进先出队列,也就是最先放进去的数 ...

  5. linux配置了dns后导致mysql远程连接慢问题

    有时候dns配置错误或者其它原因会导致mysql远程连接缓慢,此时只需要关闭mysqlDNS反向解析即可解决此问题. 打开my.cnf配置,将[mysqld]下的#skip-name-resolve前 ...

  6. jQuery中的$.each的用法

    $.each(Array,function(i,value){ this;  //this指向当前对象 i;       //i表示当前下标 value; //value表示当前元素 })

  7. 关于“ORA-01747: user.table.column, table.column 或列说明无效”的报错。

    今天在工程中遇到“ORA-01747: user.table.column, table.column 或列说明无效”的报错情况,查了一下是由于数据库列名起的不好引起的,名字用到了数据库的关键字.

  8. golang 小知识-持续更新中

    Golang 中的指针 - Pointer Go 的原生数据类型可以分为基本类型和高级类型,基本类型主要包含 string, bool, int 及 float 系列,高级类型包含 struct,ar ...

  9. vs删除空行 —— 正则表达式以及其他

    \r:return 到当前行的最左边. \n: newline 向下移动一行,并不移动左右. 1. ^\s*\n               查找空行 2. ^\s*(?=\r?$)\n  查找空行即 ...

  10. 【BZOJ2087】[Poi2010]Sheep 几何+DP

    [BZOJ2087][Poi2010]Sheep Description Lyx的QQ牧场养了很多偶数个的羊,他是Vip,所以牧场是凸多边形(畸形).现在因为他开挂,受到了惩罚,系统要求他把牧场全部分 ...