zoukankan      html  css  js  c++  java
  • 使用python的logging模块(转)

     

    一、从一个使用场景开始

    开发一个日志系统, 既要把日志输出到控制台, 还要写入日志文件

    Python代码  收藏代码
    1. import logging  
    2.   
    3. # 创建一个logger  
    4. logger = logging.getLogger('mylogger')  
    5. logger.setLevel(logging.DEBUG)  
    6.   
    7. # 创建一个handler,用于写入日志文件  
    8. fh = logging.FileHandler('test.log')  
    9. fh.setLevel(logging.DEBUG)  
    10.   
    11. # 再创建一个handler,用于输出到控制台  
    12. ch = logging.StreamHandler()  
    13. ch.setLevel(logging.DEBUG)  
    14.   
    15. # 定义handler的输出格式  
    16. formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')  
    17. fh.setFormatter(formatter)  
    18. ch.setFormatter(formatter)  
    19.   
    20. # 给logger添加handler  
    21. logger.addHandler(fh)  
    22. logger.addHandler(ch)  
    23.   
    24. # 记录一条日志  
    25. logger.info('foorbar')  

    运行后, 在控制台和日志文件都有一条日志:

    Java代码  收藏代码
    1. 2011-08-31 19:18:29,816 - mylogger - INFO - foorbar  

    二、logging模块的API

    结合上面的例子,我们说下几个最常使用的API

    logging.getLogger([name])返回一个logger实例,如果没有指定name,返回root logger。只要name相同,返回的logger实例都是同一个而且只有一个,即name和logger实例是一一对应的。这意味着,无需把logger实例在各个模块中传递。只要知道name,就能得到同一个logger实例
    Logger.setLevel(lvl)设置logger的level, level有以下几个级别:

    NOTSET < DEBUG < INFO < WARNING < ERROR < CRITICAL
    如果把looger的级别设置为INFO, 那么小于INFO级别的日志都不输出, 大于等于INFO级别的日志都输出

    Python代码  收藏代码
    1. logger.debug("foobar")    # 不输出   
    2. logger.info("foobar")        # 输出  
    3. logger.warning("foobar") # 输出  
    4. logger.error("foobar")      # 输出  
    5. logger.critical("foobar")    # 输出  

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

    logging.basicConfig([**kwargs])

    这个函数用来配置root logger, 可以看它的源码,还是挺简单的。它首先检查root是否有handler,如果没有,那这个函数会创建一个StreamHandler,并设置默认的formatter。

    然后将该handler添加到root。如果调用logging.basicConfig([**kwargs])的时候发现root logger已经有了handler,那该函数没有任何操作。

     

     
    三、关于root logger以及logger的父子关系
    前面多次提到root logger, 实际上logger实例之间还有父子关系, root logger就是处于最顶层的logger, 它是所有logger的祖先。如下图:

    root logger是默认的logger,如果不创建logger实例, 直接调用logging.debug()、logging.info()logging.warning()、logging.error()、logging.critical()这些函数,那么使用的logger就是 root logger, 它可以自动创建,也是单实例的。
    如何得到root logger通过logging.getLogger()或者logging.getLogger("")得到root logger实例。
    默认的level:root logger默认的level是logging.WARNING
    如何表示父子关系logger的name的命名方式可以表示logger之间的父子关系. 比如:parent_logger = logging.getLogger('foo')child_logger = logging.getLogger('foo.bar')
    什么是effective levellogger有一个概念,叫effective level。 如果一个logger没有显示地设置level,那么它就用父亲的level。如果父亲也没有显示地设置level, 就用父亲的父亲的level,以此推....最后到达root logger,一定设置过level。默认为logging.WARNINGchild loggers得到消息后,既把消息分发给它的handler处理,也会传递给所有祖先logger处理,
    来看一个例子

    Python代码  收藏代码
    1. import logging  
    2.   
    3. # 设置root logger  
    4. r = logging.getLogger()  
    5. ch = logging.StreamHandler()  
    6. ch.setLevel(logging.DEBUG)  
    7. formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')  
    8. ch.setFormatter(formatter)  
    9. r.addHandler(ch)  
    10.   
    11. # 创建一个logger作为父亲  
    12. p = logging.getLogger('foo')  
    13. p.setLevel(logging.DEBUG)  
    14. ch = logging.StreamHandler()  
    15. ch.setLevel(logging.DEBUG)  
    16. formatter = logging.Formatter('%(asctime)s - %(message)s')  
    17. ch.setFormatter(formatter)  
    18. p.addHandler(ch)  
    19.   
    20. # 创建一个孩子logger  
    21. c = logging.getLogger('foo.bar')  
    22. c.debug('foo')  

     输出如下:

    Python代码  收藏代码
    1. 2011-08-31 21:04:29,893 - foo  
    2. 2011-08-31 21:04:29,893 - DEBUG - foo  


    可见, 孩子logger没有任何handler,所以对消息不做处理。但是它把消息转发给了它的父亲以及root logger。最后输出两条日志。

  • 相关阅读:
    WF4.0 Beta1 自定义跟踪
    WF4.0 Beta1 流程设计器与Activity Designer
    新版本工作流平台的 (二) 权限算法(组织结构部分)
    WF4.0 Beta1 WorkflowInvoker
    WF4.0 基础篇 (十) Collection 集合操作
    WF4.0 基础篇 (十五) TransactionScope 事物容器
    WF4.0 基础篇 (六) 数据的传递 Arguments 参数
    WF4B1 的Procedural Activity 之InvokeMethod , InvokeMethod<T> 使用
    WF4.0 Beta1 异常处理
    WF4.0 Beta1 变量 Variables
  • 原文地址:https://www.cnblogs.com/ajianbeyourself/p/4884245.html
Copyright © 2011-2022 走看看