zoukankan      html  css  js  c++  java
  • python日志记录-logging模块

    1、logging模块日志级别

    使用logging模块简单示例:

    >>>import logging
    >>>logging.debug("this's a test logging")
    >>>loggin.info("still a test logging")
    # 默认情况下以上两行没有输出,需要指定日志级别才行
    >>>logging.warn("it's waring!!!")
    

    logging模块日志级别:

    日志级别
    CRITICAL 50
    ERROR 40
    WARNING 30
    INFO 20
    DEBUG 10
    UNSET 0

    对于某个级别的日志消息,只有当处理器和日志记录器配置为可以发布该级别(或者更高级别的消息时),才会发布这个日志消息。例如,如果一个消息的级别是CRITICAL,日志配置的级别是ERROR,这个消息就会发出(50>40)。如果这个消息是WARNING,而日志记录器设置为的是ERROR,这个消息就不会发出(30<40).

    2、logging模块基本理解使用

    • 不同的优先级对应不同的函数:logging.debug,logging.warn等等

    • 一个或多个Logger对象,主要通过它们使用模块

    • 把消息写入终端或文件、数据库或其他地方的handler

    • 创建输出的formatter

    • 基于输入进行筛选的过滤器


    一、设置logging日志默认优先级:

    默认级别是WARNING,设置日志默认优先级为DEBUG
    >>>import logging
    >>>logging.basicConfig(level=logging.DEBUG)
    

    二、创建logger对象

    每个logger对象都有一个名称,比如创建一个test的logger
    >>>import logging
    >>>logging.basicConfig(level='DEBUG')
    >>>logger = longgin.getLogger('test')
    >>>logger.debug('the great gates!')
    DEBUG:test:the great gates!
    

    三、使用Handler把消息输出到日志文件

    >>>import logging
    >>>logging.basicConfig(level='DEBUG', filename='test.log')
    >>>logger = logging.getLogger('tx')
    >>>logger.war('xxxxssss')
    
    日志写入了文件test.log,调用basicConfig()时使用的filename参数会创建一个FileHandler并对logger进行设置,logging模块至少包含15种handler,比如电子邮件、web服务器、屏幕和文件 

    四、控制消息的格式

    >>>import logging
    >>>fmt = '%(asctime)s %(levelname)s %(lineno)s %(message)s'
    >>>logging.basicConfig(lebel='DEBUG', filename='test.log', format=fmt)
    >>>logger = logging.getLogger('xx')
    >>>logger.warn('where is loggggg')
    2016-5-5 23:22:11,877 WARN 1 where is loggggg
    
    logging模块可以识别出fmt格式化字符串中的变量名,asctime、levelname、lineo、message,都是内置变量,也可以创建自定义变量。 

    3、日志文件旋转

    • 要想每次运行程序的时候创建一个新文件,可以向basicConfig()的参数filemode传入值"w"。不过最好不要采用这种方式管理日志文件,更好的做法是使用一个RotatingFileHandler,它会自动创建新文件,同时保留原来的文件.

    >>>import glob
    >>>import logging
    >>>import logging.handlers
    >>>logger = logging.getLogger('mylogger')
    >>>logger.setLevel(logging.DEBUG)
    >>>log_filename='test.log'
    >>>handler = logging.handlers.RotatingFileHandler(log_filename, maxBytes=100, backupCount=5)
    >>>logger.addHandler(handler)
    # 查看滚动生成的日志文件
    for i in range(100):
        logger.debug('i = %d' % i)
    # 查看那些文件被创建
    logfiles = glob.glob('%s *' % log_filename)
    for filename in logfiles:
        print filename
    结果:
    test.log
    test.log.1
    test.log.2
    ...
    test.log.5
    最新的文件总是test.log,每次达到大小限制时,就会后缀加.1重命名。现有的各个备份文件也会重命名,使后缀递增(.1变成.2,等等),.5文件会被删除
    

     4、logging模块使用问题和实例

    1、logging模块中子类继承父类过程中,父类使用logging.basicConfig()进行的配置,会覆盖掉子类中的配置.所以子类中用logging.basicConfig()进行的配置不会生效.

    2、另外使用logger=logging.getLogger()进行实例化对象过程中,如果是继承父类的,仍然不会生效,由于logging.getLogger()是以"."作为不同层级的区分.当子类需要另外设置logging的配置时,要另外通过设置handler的方式,来避免父类的logging配置掩盖子类.

    3、具体首先配置logger = logging.getLogger(__name__) "__name__"不能为空,为其他的参数也可以,如果为logger=logging.getLogger(),似乎子类配置的logger不会生效.

    增加handler:
    log_file = './test.log'
    fmt = fmt = '%(asctime)s %(filename)s %(funcName)s %(levelname)s Line:%(lineno)s :%(message)s'
    logger = logging.getLogger(__name__)
    logger.level = logging.DEBUG
    handlers = logging.FileHandler(log_file)
    formatter = logging.Formatter(fmt)
    handlers.formatter = formatter
    loggers.addHandler(handlers)

    使用logger:
    logger.info('it's a test')

    4、其logging模块参考文档:
    http://python.jobbole.com/84092/   [必看,深入浅出]
    http://python.jobbole.com/82221/   [基础全面]
    http://python.jobbole.com/81521/   [简单]
    http://python.jobbole.com/81666/   [简单]

  • 相关阅读:
    Google Map API使用详解(三)——Google Map基本常识(上)
    Google Map API使用详解(十)——使用JavaScript创建地图详解(上)
    sethc.exe
    taobao_java
    "void __cdecl operator delete[](void *)" (??_V@YAXPAX@Z) 已经在 LIBCMTD.lib(delete2.obj) 中定义 错误
    some Content
    变参 C++ 转帖
    阅读大型程序你得到什么
    一些模块
    a common jsp
  • 原文地址:https://www.cnblogs.com/starsea/p/5464043.html
Copyright © 2011-2022 走看看