Python 如何限制输出日志的大小
限制输出日志的大小有多种方法,最优雅的莫过于直接使用rotate机制,这种机制广泛存在于各种编程语言,Python也不例外。其次,还可以使用mount挂载一个文件,作为日志存储的位置,因为文件大小是有限的,所以日志的大小也被限制。还有可以用ulimit。
RotatingFileHandler
RotatingFileHandler是logging.handler的一种,在pythondocs中,这个类的构造函数示例用法如下
classlogging.handlers.RotatingFileHandler(filename,mode=‘a',maxBytes=0,backupCount=0,encoding=None,delay=False)
参数
filename输出的文件名,如果使用Python3.6或者更新版本的Python,filename可以是一个Path对象,Path对象可以让你更优雅地操作文件路径,它是Python新增的特性。
mode有"w"和"a",如果是w,那么每次输出日志,都会覆盖之前已经存在的日志,从第一行开始输出,如果是a,会保留之前的日志,在之前的日志后输出。
maxBytes日志最大的大小,单位是字节
backupCount如果日志大小达到maxBytes,会将旧日志加上.1或.2这样的后缀,与filename区分,并在新的filename文件第一行开始输出。如果为1,则有最多有一个旧日志的备份。
encoding字符编码,常用的有utf-8
importlogging fromlogging.handlersimportRotatingFileHandler log=logging.getLogger() handler=RotatingFileHandler("test","a",4096,2,"utf-8") log.addHandler(handler) #更高级的logging特性 log.setLevel(logging.INFO)#设置过滤的日志等级 formatter=logging.Formatter("%(asctime)s%(levelname)s:%(message)") log.setFormatter(formatter)#设置日志输出的格式
Mount
先创建文件,并格式化成ext4文件系统
ddif=/dev/zeroof=./logfsbs=1Mcount=4 mkfs.ext4./logfs
mkdirlog sudomount-text4./logfs./log pythontest.py2>./log/test.log
需要注意的是,这种方法可能有权限问题,如果python程序权限不够,需要更改挂载后log目录的权限,使用sudochmod777-Rlog
补充:
python控制日志级别输出,可进行全局限流,可控制控制台输出,可用于线上配置,进行日志的简单记录
#coding=utf-8 importlogging importdatetime importos CONSOLE=True LEVEL="DEBUG" #log/2020-09/2020-09-27_APPLICATION_NAME.log APPLICATION_NAME="APPLICATION_NAME" #只生成GBK的日志文件 classRecordLog: def__init__(self): """ 1、控制日志是否在控制台中打印 2、控制日志输出的级别 """ #设置是否控制台打印 self._console=CONSOLE #等级字典 self._level_dict={'DEBUG':1,'INFO':2,'WARNING':3,'ERROR':4,'CRITICAL':5} #设置当前支持的日志等级 self._current_level_num=self._level_dict[LEVEL] defget_log_file_name(self,): """ 创建日志文件夹,创建或调用日志文件,日志存储 :return:log/log_folder(月份)/log_file(每天的log) """ now=str(datetime.datetime.now()) log_folder=now[:7] log_file=now[:10]+"_"+APPLICATION_NAME+".log" ifos.path.exists("log/"+log_folder): pass else: os.makedirs("log/"+log_folder) return"log/"+log_folder+"/"+log_file deflog_content(self,content='开始记录',level="DEBUG"): """ 记录日志 :paramcontent:记录的内容 :paramlevel:DEBUG,INFO,WARNING,ERROR,CRITICAL :return: """ LOG_FILE_NAME=self.get_log_file_name() now1=datetime.datetime.now() now_date=now1.strftime("%Y-%m-%d-%H:%M:%S") text="%s%s--%s"%(level,now_date,content) iflevelin['DEBUG','INFO','WARNING','ERROR','CRITICAL']: level_num=self._level_dict[level] #控制台输出 ifself._console: print(text) logger=logging.getLogger() fh=logging.FileHandler(filename=LOG_FILE_NAME,encoding="utf-8",mode="a") #formatter=logging.Formatter("%(asctime)s-%(name)s-%(levelname)s%(message)s") #fh.setFormatter(formatter) logger.addHandler(fh) #设置日志等级 if"DEBUG"==levelandlevel_num>=self._current_level_num: logger.setLevel(logging.DEBUG) elif"INFO"==levelandlevel_num>=self._current_level_num: logger.setLevel(logging.INFO) elif"WARNING"==levelandlevel_num>=self._current_level_num: logger.setLevel(logging.WARNING) elif"ERROR"==levelandlevel_num>=self._current_level_num: logger.setLevel(logging.ERROR) else: logger.setLevel(logging.CRITICAL) logger.info(text) else: raiseException('日志等级传参错误:%s;正确格式为:DEBUG,INFO,WARNING,ERROR,CRITICAL'%level) if__name__=='__main__': # log=RecordLog() log.log_content(level='DEBUG')
以上为个人经验,希望能给大家一个参考,也希望大家多多支持毛票票。如有错误或未考虑完全的地方,望不吝赐教。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。