美文网首页我爱编程
python菜鸟开发日记-logging详解

python菜鸟开发日记-logging详解

作者: python菜鸟 | 来源:发表于2018-04-13 20:19 被阅读119次

    玩django的时候按照网上教程添加logging,确一直不懂logging怎么使用,今天下午花啦点时间把logging整理啦以下。
    啥也不说,先上图:


    loggin大致流程图

    先来第一步,创建一个简单的例子:

    首先定义一个logging
    import logging
    定义一个文件输出格式。
    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')
    
    ******************************************************************
    #在定义一个StreamHandler,将INFO级别或更高的日志信息打印到标准错误,并将其添加到当前的日志处理对象#
    说白啦就是定义一个输出方法
    console = logging.StreamHandler()
    console.setLevel(logging.INFO) 定义一个等级输出到控制台
    创建一个格式
    **********************************************************************
    formatter = logging.Formatter('%(name)-12s: %(levelname)-8s %(message)s')
    将console的格式设置为formatter
    就是将输出格式跟输出方法进行绑定
    console.setFormatter(formatter)
    *******************************************************************
    最后利用
    logging.getLogger('').addHandler(console)  将定义的东西添加到logging
    

    再来看看日志回滚,就是最多支持的文件数量及大小,这个就相当于日志永远不会一直扩大,相当于会不停的进行覆盖:

    logging之日志回滚,相当于最多使用5个日志文件
    import logging
    from logging.handlers import RotatingFileHandler
    
    #################################################################################################
    定义一个logger并设置文件输出方法
    #定义一个RotatingFileHandler,最多备份5个日志文件,每个日志文件最大10M
    Rthandler = RotatingFileHandler('myapp.log', maxBytes=10*1024*1024,backupCount=5)
    设置改显示或者写入的等级。
    Rthandler.setLevel(logging.INFO)
    设置输出格式
    formatter = logging.Formatter('%(name)-12s: %(levelname)-8s %(message)s')
    最后进行绑定输出格式
    Rthandler.setFormatter(formatter)
    好吧,现在才是最后,添加进去
    logging.getLogger('').addHandler(Rthandler)
    ################################################################################################
    
    

    现在来个跟流程图几乎一样的结构:

    mport sys
    
    # 获取logger实例,如果参数为空则返回root logger
    logger = logging.getLogger("AppName")
    
    # 指定logger输出格式
    formatter = logging.Formatter('%(asctime)s %(levelname)-8s: %(message)s')
    
    # 文件日志
    file_handler = logging.FileHandler("test.log")
    file_handler.setFormatter(formatter)  # 可以通过setFormatter指定输出格式
    
    # 控制台日志
    console_handler = logging.StreamHandler(sys.stdout)
    console_handler.formatter = formatter  # 也可以直接给formatter赋值
    
    # 为logger添加的日志处理器
    logger.addHandler(file_handler)
    logger.addHandler(console_handler)
    
    # 指定日志的最低输出级别,默认为WARN级别
    logger.setLevel(logging.INFO)
    
    # 输出不同级别的log
    logger.debug('this is debug info')
    logger.info('this is information')
    logger.warn('this is warning message')
    logger.error('this is error message')
    logger.fatal('this is fatal message, it is same as logger.critical')
    logger.critical('this is critical message')
    
    

    下面来个适用的例子,采用conf配置文件的方式,这个我感觉最适合项目使用啦:

    #logger.conf
    ###############################################
    [loggers]   定义一个logger
    keys=root,example01,一个默认的root,一个exampler01.
    [logger_root]
    level=DEBUG
    handlers=hand01,hand02
    
    [logger_example01]   第一个logger
    handlers=hand01,hand02    有两个handlers
    qualname=example01     对应名称
    propagate=0
    ###############################################
    [handlers]   定义handlers的输出方法
    keys=hand01,hand02 定义啦2个handlers方法
    [handler_hand01]
    class=StreamHandler  定义输出方法
    level=DEBUG   定义输出等级
    formatter=form01   定义格式化方式
    args=(sys.stderr,)
    
    [handler_hand02]
    class=handlers.RotatingFileHandler   
    level=INFO 
    formatter=form01   
    args=('myapp.log', 'a', 10*1024*1024, 5)
    ###############################################
    [formatters]  定义输出格式
    keys=form01
    [formatter_form01]
    format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s'
    datefmt=%a, %d %b %Y %H:%M:%S
    
    dome.py文件调用
    import logging
    import logging.config
    logging.config.fileConfig("logger.conf")
    logger = logging.getLogger("example01")
    logger.debug('This is debug message')
    logger.info('This is info message')
    logger.warning('This is warning message')
    

    bingo,完成,这个已经足够普通使用啦,如果还要细化得看英文的官方文档啦,对于我这个半吊子的水平来说比较压力山大。

    相关文章

      网友评论

        本文标题:python菜鸟开发日记-logging详解

        本文链接:https://www.haomeiwen.com/subject/iqyhkftx.html