zoukankan      html  css  js  c++  java
  • 高级Logger教程(译)

      这是之前闲来无事时翻译的,英文水平有限,翻译的不好还请轻拍。

    原文地址:
    https://docs.python.org/2/howto/logging.html#logging-advanced-tutorial


      logging库采用了一种模块化的组装,提供了几种不同类型的组件:loggers、handlers、filters、formatters。

    * Loggers揭示了应用代码直接使用的接口
    * Handlers将log记录(由Logger创建的)发送到合适的目的地
    * Filters提供了出色的粒度的工具,这些工具决定使用哪些log记录输出
    * Formatters指定最终输出的log记录的格式

      Log事件信息在LogRecord实例中在loggers、handlers、filters和formatters之间传送。

      Logging通过调用Logger类的实例方法执行。每个实例都有一个名字,从概念上在名称空间层次结构中进行排列,用点作为分隔符。举个例子,一个名叫scan的logger是loggers:‘scan.text‘、’scan.html‘、’scan.pdf‘的父辈。Logger名称可以任意选取,表明产生log信息的应用的区域。

      比较好的为logger取名的惯例就是使用module-level logger,在使用logging的每个模块中,像下面这样取名:

    logger = logging.getLogger(__name__)

      这表明logger取名是根据package/module层次结构来的,而且从名称中就可以看出它是哪个模块里面的事件的logger。

      这个层次结构的最顶端就是root,它的logger就叫root logger。要调用logger需要使用的方法:debug(), info(), warning(), error()和critical(),这些在root logger中使用就是本名。这些函数和方法都有相同的签名。root logger在输出信息中的名字就是“root”。

      当然,log信息也是可以输出在不同的地方的。在将logger信息写入文件的包里面都支持这个功能,HTTP GET/POST处,使用SMTP的email,通用的sockets,或者定制操作系统的logging机制比如说syslog或者windows NT 事件log。目标地由handler类控制。如果你有特殊的需求,并且没有在任何内置的handler类里面的话,你也可以创建自定义的log目标地类。

      默认情况下,不会为logging信息设定输出目标地。你可以设置basicConfig()指定一个目标地(比如控制台或者文件),这一块在初级教程中已经给出例子。如果你调用方法:debug(), info(), warning(), error()或critical(),他们就会检查是否已经设置了输出目的,如果没有设置过,在代理到 root logger将实际的信息输出之前,默认会将目标地设置成控制台(sys.stderr)输出,同时还会设定一个默认的格式。

      basicConfig()默认的log信息格式为:

    severity:logger name:message

     这个格式也可以通过传给basicConfig()一个格式字符串到format这个关键字参数中。


    Logging Flow
      Log事件信息在loggers和handlers中的流程如下图展示:


    Loggers
      Logger对象有三方面的工作。第一,它暴露出几个方法给应用代码,这样,应用就能在运行中记录信息;第二,logger对象决定了哪些log信息是使用severity(默认的filter工具)或者filter对象去执行;第三,logger对象传送相关的log信息给那些对此感兴趣的log handler。

      Logger对象使用最多的方法分为两类:confiuration 和 message sending。

      下面这些是最常用的configuration方法:
    * Logger.setLevel()
    * Logger.addHandler()和Logger.removerHandler()
    * Logger.addFilter()和Logger.removeFilter()

      logger对象设置后,下面这些方法就能创建log信息了:
    * Logger.debug()、Logger.info()、Logger.warning()、Logger.error()、Logger.critical()
    * Logger.exception()
    * Logger.log()


    Handlers
      Handler对象的职责是分发合适的log信息到handler指定的目的地。


    Filters
      Formatter对象配置log信息最终的排序、结构和内容。


    Configuring Logging
      开发人员可以通过以下三种方式配置logging:
    1. 用Python代码显式调用以上提到的配置方法创建loggers、handlers和formatters,
    2. 建立一个logging配置文件,用fileConfig()方法读取
    3. 创建一个配置信息字典,并把它传给dictConfig()方法

    下面这个例子配置了一个非常简单的logger、一个控制台handler和一个简单的formatter:

    import logging 
    
    # create logger 
    logger = logging.getLogger('simple_example') logger.setLevel(logging.DEBUG) 
    
    # create console handler and set level to debug 
    ch = logging.StreamHandler() 
    ch.setLevel(logging.DEBUG) 
    
    # create formatter 
    formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') 
    
    # add formatter to ch 
    ch.setFormatter(formatter) 
    
    # add ch to logger 
    logger.addHandler(ch) 
    
    # 'application' code 
    logger.debug('debug message') 
    logger.info('info message') 
    logger.warn('warn message') 
    logger.error('error message') 
    logger.critical('critical message')

    用控制行运行这个模块,就会有下面的输出:

    $ python simple_logging_module.py 
    2005-03-19 15:10:26,618 - simple_example - DEBUG - debug message 
    2005-03-19 15:10:26,620 - simple_example - INFO - info message 
    2005-03-19 15:10:26,695 - simple_example - WARNING - warn message 
    2005-03-19 15:10:26,697 - simple_example - ERROR - error message 
    2005-03-19 15:10:26,773 - simple_example - CRITICAL - critical message
  • 相关阅读:
    Leetcode(680) ;验证回文字符串 Ⅱ
    mysql常用操作语句
    组合索引问题
    php生成一维码以及保存-转载
    php后台实现页面跳转的方法-转载
    php操作表格(写)
    虚拟机复制后上网冲突的问题
    centos下安装nginx(转载)
    虚拟机与宿主机可以互相ping通,但是外网不能
    防火墙设置:虚拟机ping不通主机,但是主机可以ping通虚拟机(转载)
  • 原文地址:https://www.cnblogs.com/carrotH/p/3985849.html
Copyright © 2011-2022 走看看