day⑥:logging模块

The logging library takes a modular approach and offers several categories of components: loggers, handlers, filters, and formatters.
• Loggers expose the interface that application code directly uses.
• Handlers send the log records (created by loggers) to the appropriate destination.
• Filters provide a finer grained facility for determining which log records to output.
• Formatters specify the layout of log records in the final output.

logger:提供日志接口,供应用代码使用。logger最长用的操作有两类:配置和发送日志消息。可以通过logging.getLogger(name)获取logger对象,如果不指定name则返回root对象,多次使用相同的name调用getLogger方法返回同一个logger对象。
handler:将日志记录(log record)发送到合适的目的地(destination),比如文件,socket等。一个logger对象可以通过addHandler方法添加0到多个handler,每个handler又可以定义不同日志级别,以实现日志分级过滤显示。
filter:提供了过滤日志信息的方法,。
formatter:指定日志记录输出的具体格式。formatter的构造方法需要两个参数:消息的格式字符串和日期字符串,这两个参数都是可选的。

说说最常用logging的函数或者类
①logging.getLogger([name])
返回一个logger实例,如果没有name,返回root logger
如果name相同那么是同一个logger的实例

②Logger.setLevel(level)
日志级别大小关系为: critical > error > warning > info > debug > notset 也可自定义日志级别
logger.debug("xxx")
logger.info("xxx")
logger.warning("xxx")
logger.error("xxx")
logger.critical("xxx")

③Logger.addHandler(hdlr)
logger可以雇佣handler来帮它处理日志, handler主要有以下几种:
StreamHandler: 输出到控制台
FileHandler: 输出到文件
handler还可以设置自己的level以及输出格式。


④logging.basicConfig([**kwargs])
* 这个函数用来配置root logger, 为root logger创建一个StreamHandler,
设置默认的格式。
* 这些函数: logging.debug()、logging.info()、logging.warning()、
logging.error()、logging.critical() 如果调用的时候发现root logger没有任何
handler, 会自动调用basicConfig添加一个handler
* 如果root logger已有handler, 这个函数不做任何事情

logging.basicConfig # 通过logging.basicConfig函数对日志的输出格式及方式做相关配置
# basicConfig 相关参数帮助
filename # 指定日志文件名
filemode # 和file函数意义相同,指定日志文件的打开模式,'w'或'a'
datefmt # 指定时间格式,同time.strftime()
level # 设置日志级别,默认为logging.WARNING
stream # 指定将日志的输出流,可以指定输出到sys.stderr,sys.stdout或者文件,默认输出到sys.stderr,当stream和filename同时指定时,stream被忽略
format # 指定输出的格式和内容,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 # 打印日志信息


例子:
logging.basicConfig(level=logging.DEBUG,
format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',
datefmt='%a, %d %b %Y %H:%M:%S',
filename='myapp.log',
filemode='w')







实践例子:
  1. 一.直接在程序中定义LoggerHandlerFiterFormatter
  2. [root@monitor logging]# vim test2.py
  3. #!/usr/bin/python
  4. #coding=utf-8
  5. import logging
  6. #创建一个logger
  7. logger1 = logging.getLogger('yaobin')
  8. logger1.setLevel(logging.DEBUG) #全局的日志水平,最高,奇葩东西,应该单独最高的,不然我单独设置日志水平没意义了。
  9. #创建一个handler,用于写入日志文件创建一个handler,用于写入日志文件
  10. fh = logging.FileHandler('/tmp/test.log')
  11. fh.setLevel(logging.DEBUG) #单独设置日志水平
  12. #再创建一个handler,用于输出到控制台,即是屏幕
  13. ch = logging.StreamHandler()
  14. ch.setLevel(logging.WARNING) #单独设置日志水平
  15. #最后我发现单独设置的日志水平比全局的高,生效单独的日志水平
  16. #单独设置的日志水平比全局的低,生效全局的日志水平
  17. # 定义handler的输出格式formatter
  18. formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
  19. fh.setFormatter(formatter)
  20. ch.setFormatter(formatter)
  21. #给logger添加handler
  22. logger1.addHandler(fh)
  23. logger1.addHandler(ch)
  24. #记录日志
  25. logger1.debug('logger1 debug message')
  26. logger1.info('logger1 info message')
  27. logger1.warning('logger1 warning message')
  28. logger1.error('logger1 error message')
  29. logger1.critical('logger1 critical message')
  30. #执行脚本
  31. [root@monitor logging]# python test2.py #马上就有屏幕的输出
  32. 2015-12-15 17:38:52,024 - yaobin - DEBUG - logger1 debug message
  33. 2015-12-15 17:38:52,024 - yaobin - INFO - logger1 info message
  34. 2015-12-15 17:38:52,025 - yaobin - WARNING - logger1 warning message
  35. 2015-12-15 17:38:52,025 - yaobin - ERROR - logger1 error message
  36. 2015-12-15 17:38:52,025 - yaobin - CRITICAL - logger1 critical message
  37. #查看文件的记录
  38. [root@zabbix_monitor logging]# cat /tmp/test.log
  39. 2016-02-25 19:37:20,718 - yaobin - DEBUG - logger1 debug message
  40. 2016-02-25 19:37:20,719 - yaobin - INFO - logger1 info message
  41. 2016-02-25 19:37:20,719 - yaobin - WARNING - logger1 warning message
  42. 2016-02-25 19:37:20,719 - yaobin - ERROR - logger1 error message
  43. 2016-02-25 19:37:20,720 - yaobin - CRITICAL - logger1 critical message






原文地址:https://www.cnblogs.com/binhy0428/p/5221250.html