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,则在文件的创建过程中

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

posted @ 2019-12-06 11:32  spellbound  阅读(2089)  评论(0编辑  收藏  举报