• Python模块学习之logging


    logging模块是在2.3新引进的功能,下面是一些常用的类和模块级函数

     

    模块级函数

    logging.getLogger([name]):返回一个logger对象,如果没有指定名字将返回root logger

    logging.debug()、logging.info()、logging.warning()、logging.error()、logging.critical():设定root logger的日志级别

    logging.basicConfig():用默认Formatter为日志系统建立一个StreamHandler,设置基础配置并加到root logger中

     

     

    import logging
    import sys
     
    LEVELS = {'debug': logging.DEBUG,
              'info': logging.INFO,
              'warning': logging.WARNING,
              'error': logging.ERROR,
              'critical': logging.CRITICAL}
     
    if len(sys.argv) > 1:
        level_name = sys.argv[1]
        level = LEVELS.get(level_name, logging.NOTSET)
        logging.basicConfig(level=level)
     
    logging.debug('This is a debug message')
    logging.info('This is an info message')
    logging.warning('This is a warning message')
    logging.error('This is an error message')
    logging.critical('This is a critical error message')

     

    运行结果如下:

    $ python logging_level_example.py debug
    DEBUG:root:This is a debug message
    INFO:root:This is an info message
    WARNING:root:This is a warning message
    ERROR:root:This is an error message
    CRITICAL:root:This is a critical error message
    
    $ python logging_level_example.py info
    INFO:root:This is an info message
    WARNING:root:This is a warning message
    ERROR:root:This is an error message
    CRITICAL:root:This is a critical error message

    Loggers

    
    

    Logger.setLevel(lel):指定最低的日志级别,低于lel的级别将被忽略。debug是最低的内置级别,critical为最高

    
    

    Logger.addFilter(filt)、Logger.removeFilter(filt):添加或删除指定的filter

    
    

    Logger.addHandler(hdlr)、Logger.removeHandler(hdlr):增加或删除指定的handler

    
    

    Logger.debug()、Logger.info()、Logger.warning()、Logger.error()、Logger.critical():可以设置的日志级别

    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

    Handlers

    
    

    handler对象负责发送相关的信息到指定目的地。可以通过addHandler()方法添加多个多handler

    
    

    Handler.setLevel(lel):指定被处理的信息级别,低于lel级别的信息将被忽略

    
    

    Handler.setFormatter():给这个handler选择一个格式

    
    

    Handler.addFilter(filt)、Handler.removeFilter(filt):新增或删除一个filter对象

    
    

     

    
    

    Formatters

    
    

    Formatter对象设置日志信息最后的规则、结构和内容,默认的时间格式为%Y-%m-%d %H:%M:%S,下面是Formatter常用的一些信息

    
    

    %(name)s

    Logger的名字

    %(levelno)s

    数字形式的日志级别

    %(levelname)s

    文本形式的日志级别

    %(pathname)s

    调用日志输出函数的模块的完整路径名,可能没有

    %(filename)s

    调用日志输出函数的模块的文件名

    %(module)s

    调用日志输出函数的模块名

    %(funcName)s

    调用日志输出函数的函数名

    %(lineno)d

    调用日志输出函数的语句所在的代码行

    %(created)f

    当前时间,用UNIX标准的表示时间的浮 点数表示

    %(relativeCreated)d

    输出日志信息时的,自Logger创建以 来的毫秒数

    %(asctime)s

    字符串形式的当前时间。默认格式是 “2003-07-08 16:49:45,896”。逗号后面的是毫秒

    %(thread)d

    线程ID。可能没有

    %(threadName)s

    线程名。可能没有

    %(process)d

    进程ID。可能没有

    %(message)s

    用户输出的消息


    再来一个例子:

    
    
    import logging
     
    # set up logging to file - see previous section for more details
    logging.basicConfig(level=logging.DEBUG,
                        format='%(asctime)s %(name)-12s %(levelname)-8s %(message)s',
                        datefmt='%m-%d %H:%M',
                        filename='/temp/myapp.log',
                        filemode='w')
    # define a Handler which writes INFO messages or higher to the sys.stderr
    console = logging.StreamHandler()
    console.setLevel(logging.INFO)
    # set a format which is simpler for console use
    formatter = logging.Formatter('%(name)-12s: %(levelname)-8s %(message)s')
    # tell the handler to use this format
    console.setFormatter(formatter)
    # add the handler to the root logger
    logging.getLogger('').addHandler(console)
     
    # Now, we can log to the root logger, or any other logger. First the root...
    logging.info('Jackdaws love my big sphinx of quartz.')
     
    # Now, define a couple of other loggers which might represent areas in your
    # application:
     
    logger1 = logging.getLogger('myapp.area1')
    logger2 = logging.getLogger('myapp.area2')
     
    logger1.debug('Quick zephyrs blow, vexing daft Jim.')
    logger1.info('How quickly daft jumping zebras vex.')
    logger2.warning('Jail zesty vixen who grabbed pay from quack.')
    logger2.error('The five boxing wizards jump quickly.')
    
    

    运行后,在终端看到的结果

    root        : INFO     Jackdaws love my big sphinx of quartz.
    myapp.area1 : INFO     How quickly daft jumping zebras vex.
    myapp.area2 : WARNING  Jail zesty vixen who grabbed pay from quack.
    myapp.area2 : ERROR    The five boxing wizards jump quickly.

    在日志文件中的结果

    10-22 22:19 root         INFO     Jackdaws love my big sphinx of quartz.
    10-22 22:19 myapp.area1  DEBUG    Quick zephyrs blow, vexing daft Jim.
    10-22 22:19 myapp.area1  INFO     How quickly daft jumping zebras vex.
    10-22 22:19 myapp.area2  WARNING  Jail zesty vixen who grabbed pay from quack.
    10-22 22:19 myapp.area2  ERROR    The five boxing wizards jump quickly.

    发现DEBUG信息只有在文件中出现,这是因为StreamHandler中setLevel是INFO,可以看出Logger.setLevel()和handler.setLevel()的区别

    详细信息请参阅 http://docs.python.org/library/logging.html

     
     

     

  • 相关阅读:
    20145206《信息安全系统设计基础》第0周学习总结
    20145206邹京儒《Java程序设计》课程总结
    20145206、20145325、20145326、20145311团队第一周博客
    20145206《Java程序设计》第10周学习总结
    20145206《Java程序设计》实验五Java网络编程及安全
    20145206《Java程序设计》第9周学习总结
    20145206实验四《Android开发基础》
    20145206《Java程序设计》实验三实验报告
    20145206邹京儒《Java程序设计》第8周学习总结
    福大软工1816 · 第一次作业
  • 原文地址:https://www.cnblogs.com/chgxtony/p/4340453.html
Copyright © 2020-2023  润新知