zoukankan      html  css  js  c++  java
  • 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






  • 相关阅读:
    Beginning Auto Layout Tutorial in iOS 7: Part 2
    Beginning Auto Layout Tutorial in iOS 7: Part 1
    Autolayout 03
    Autolayout 02
    Autolayout 01
    Start Developing iOS Apps Today
    Spring 7大功能模块的作用
    struts2入门
    myeclipse导入工程 Some projects cannot be imported because they already exist in the workspace
    第十一章 Servlet MVC模式
  • 原文地址:https://www.cnblogs.com/binhy0428/p/5221250.html
Copyright © 2011-2022 走看看