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