日志回滚
使用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,则在文件的创建过程中
库会判断是否有超过这个数,若超过,则会从最先创建的开始删除。