• python使用logger实现日志回滚和异常捕捉


    日志回滚

    使用logger模块设置日志输出到文件中,使用TimedRotatingFileHandler

    import time
    import logging
    import logging.handlers
    
    def loghandler(name):
        #初始化logging
        logging.basicConfig()
        mylog=logging.getLogger(name)
    
        #设置日志级别
        mylog.setLevel(logging.INFO)
    
        #添加TimeRoatingFileHandler
        #定义一个1天换一次log文件的handler
        #保留7个旧log文件
        timefilehandler=logging.handlers.TimedRotatingFileHandler("log1/log.log",when='D',interval=1,backupCount=7)
        timefilehandler.suffix="%Y-%m-%d.log"
    
        #设置log记录输出的格式
        formatter=logging.Formatter('%(asctime)s-%(name)s-%(levelname)s-%(filename)s-%(lineno)d-%(message)s')
        timefilehandler.setFormatter(formatter)
    
        #添加到logger中
        mylog.addHandler(timefilehandler)
        return mylog

     程序异常捕捉

    使用traceback statck追踪记录代码异常,格式为:

    try:
    
        do-something-block
    
    except:
    
        logger.exception("Exception Logged")

     

    最终代码:

    import time
    import logging
    import logging.handlers
    
    def loghandler(name):
        #初始化logging
        logging.basicConfig()
        mylog=logging.getLogger(name)
    
        #设置日志级别
        mylog.setLevel(logging.INFO)
    
        #添加TimeRoatingFileHandler
        #定义一个1天换一次log文件的handler
        #保留7个旧log文件
        timefilehandler=logging.handlers.TimedRotatingFileHandler("log1/log.log",when='D',interval=1,backupCount=7)
        timefilehandler.suffix="%Y-%m-%d.log"
    
        #设置log记录输出的格式
        formatter=logging.Formatter('%(asctime)s-%(name)s-%(levelname)s-%(filename)s-%(lineno)d-%(message)s')
        timefilehandler.setFormatter(formatter)
    
        #添加到logger中
        mylog.addHandler(timefilehandler)
        return mylog
    
    
    
    
    #调用函数,实现日志输出
    log=loghandler('mylog')
    try:
        assert 1==2
        log.info('hello')
    
    except:
        #实现追踪异常返回信息
        log.exception("Failed to assert 1==2")

    实现捕获异常效果如下:

    小结知识点:

    1、日志记录输出的格式,实例化Formatter类

    属性名称
        格式  
                                           说明  
    name
    %(name)s
    日志的名称
    asctime
    %(asctime)s
    可读时间,默认格式‘2003-07-08 16:49:45,896’,逗号之后是毫秒
    filename
    %(filename)s
    文件名,pathname的一部分
    pathname
    %(pathname)s
    文件的全路径名称
    funcName
    %(funcName)s
    调用日志多对应的方法名
    levelname
    %(levelname)s
    日志的等级
    levelno
    %(levelno)s
    数字化的日志等级
    lineno
    %(lineno)d
    被记录日志在源码中的行数
    module
    %(module)s
    模块名
    msecs %(msecs)d 时间中的毫秒部分
    process
    %(process)d
    进程的ID
    processName
    %(processName)s
    进程的名称
    thread
    %(thread)d
    线程的ID
    threadName
    %(threadName)s
    线程的名称
    relativeCreated
    %(relativeCreated)d
    日志被创建的相对时间,以毫秒为单位

    2、日志级别

    FATAL(致命错误,一般不用)>CRITICAL(严重错误,级别数值50)>ERROR(错误,级别数值40)>WARNING(警告信息,级别数值30)>INFO(日常信息,级别数值20)>DEBUG(调式信息,级别数值10)

    格式为:

    setlevel(logging.INFO)

    3、按照时间日志回滚

    格式:

    TimedRotatingFileHandler(filename [,when [,interval [,backupCount]]])

    filename :是输出日志文件名的前缀,比如log/myapp.log
    when 是一个字符串的定义如下:
    “S”: Seconds
    “M”: Minutes
    “H”: Hours
    “D”: Days
    “W”: Week day (0=Monday)
    “midnight”: Roll over at midnight
    interval: 是指等待多少个单位when的时间后,Logger会自动重建文件,当然,这个文件的创建
    取决于filename+suffix,若这个文件跟之前的文件有重名,则会自动覆盖掉以前的文件,所以
    有些情况suffix要定义的不能因为when而重复。
    backupCount :是保留日志个数。默认的0是不会自动删除掉日志。若设7,则在文件的创建过程中
    库会判断是否有超过这个7,若超过,则会从最先创建的开始删除。

    4、按照文件大小回滚日志

    logging.handlers.RotatingFileHandler('log-day/myDemo.log', maxBytes=1*1024, backupCount=5)

    maxBytes:每个日志文件最大的大小(这里设置1K)

    backupCount: 是保留日志个数。默认的0是不会自动删除掉日志。若设7,则在文件的创建过程中

    库会判断是否有超过这个数,若超过,则会从最先创建的开始删除。

  • 相关阅读:
    爱情三十七课,恩情仪式
    爱情三十二课,幽默的用法
    爱情四十二课,距离就是问题
    爱情二十八课,你为什么爱
    爱情三十四课,放手的时机
    爱情三十九课,爱的礼物
    爱情三十三课,读懂愤怒
    爱情三十一课,先信自己
    爱情三十课,爱情整理术
    爱情二十四课,妥协50分
  • 原文地址:https://www.cnblogs.com/nimantou/p/11994317.html
Copyright © 2020-2023  润新知