python日志模块备份_Python Logging模块 输出日志颜色、过期清理和日志滚动备份

#coding:utf-8

importloggingfrom logging.handlers importRotatingFileHandler # 按文件大小滚动备份import colorlog #控制台日志输入颜色

importtimeimportdatetimeimportos

cur_path= os.path.dirname(os.path.realpath(__file__)) #log_path是存放日志的路径

log_path = os.path.join(os.path.dirname(cur_path), 'logs')if not os.path.exists(log_path): os.mkdir(log_path) #如果不存在这个logs文件夹,就自动创建一个

logName = os.path.join(log_path, '%s.log' % time.strftime('%Y-%m-%d')) #文件的命名

log_colors_config={'DEBUG': 'cyan','INFO': 'green','WARNING': 'yellow','ERROR': 'red','CRITICAL': 'red',

}classLog:def __init__(self, logName=logName):

self.logName=logName

self.logger=logging.getLogger()

self.logger.setLevel(logging.DEBUG)

self.formatter=colorlog.ColoredFormatter('%(log_color)s[%(asctime)s] [%(filename)s:%(lineno)d] [%(module)s:%(funcName)s] [%(levelname)s]- %(message)s',

log_colors=log_colors_config) #日志输出格式

self.handle_logs()defget_file_sorted(self, file_path):"""最后修改时间顺序升序排列 os.path.getmtime()->获取文件最后修改时间"""dir_list=os.listdir(file_path)if notdir_list:return

else:

dir_list= sorted(dir_list, key=lambdax: os.path.getmtime(os.path.join(file_path, x)))returndir_listdefTimeStampToTime(self, timestamp):"""格式化时间"""timeStruct=time.localtime(timestamp)return str(time.strftime('%Y-%m-%d', timeStruct))defhandle_logs(self):"""处理日志过期天数和文件数量"""dir_list= ['report'] #要删除文件的目录名

for dir indir_list:

dirPath= os.path.abspath(os.path.dirname(os.path.dirname(__file__))) + '\\' + dir #拼接删除目录完整路径

file_list = self.get_file_sorted(dirPath) #返回按修改时间排序的文件list

if file_list: #目录下没有日志文件

for i infile_list:

file_path= os.path.join(dirPath, i) #拼接文件的完整路径

t_list = self.TimeStampToTime(os.path.getctime(file_path)).split('-')

now_list= self.TimeStampToTime(time.time()).split('-')

t= datetime.datetime(int(t_list[0]), int(t_list[1]),

int(t_list[2])) #将时间转换成datetime.datetime 类型

now = datetime.datetime(int(now_list[0]), int(now_list[1]), int(now_list[2]))if (now - t).days > 6: #创建时间大于6天的文件删除

self.delete_logs(file_path)if len(file_list) > 4: #限制目录下记录文件数量

file_list = file_list[0:-4]for i infile_list:

file_path=os.path.join(dirPath, i)print(file_path)

self.delete_logs(file_path)defdelete_logs(self, file_path):try:

os.remove(file_path)exceptPermissionError as e:

Log().warning('删除日志文件失败:{}'.format(e))def __console(self, level, message):#创建一个FileHandler,用于写到本地

fh = RotatingFileHandler(filename=self.logName, mode='a', maxBytes=1024 * 1024 * 5, backupCount=5,

encoding='utf-8') #使用RotatingFileHandler类,滚动备份日志

fh.setLevel(logging.DEBUG)

fh.setFormatter(self.formatter)

self.logger.addHandler(fh)#创建一个StreamHandler,用于输出到控制台

ch =colorlog.StreamHandler()

ch.setLevel(logging.DEBUG)

ch.setFormatter(self.formatter)

self.logger.addHandler(ch)if level == 'info':

self.logger.info(message)elif level == 'debug':

self.logger.debug(message)elif level == 'warning':

self.logger.warning(message)elif level == 'error':

self.logger.error(message)#这两行代码是为了避免日志输出重复问题

self.logger.removeHandler(ch)

self.logger.removeHandler(fh)

fh.close()#关闭打开的文件

defdebug(self, message):

self.__console('debug', message)definfo(self, message):

self.__console('info', message)defwarning(self, message):

self.__console('warning', message)deferror(self, message):

self.__console('error', message)if __name__ == "__main__":

log=Log()

log.debug("---测试开始----")

log.info("操作步骤")

log.warning("----测试结束----")

log.error("----测试错误----")

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/470179.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JS高级——手写call()、apply()、bind()

0、call、apply、bind的区别 bind,call,apply的作用都是用来改变this指向的 call方法 call方法的第一个参数是this的指向 后面传入的是一个参数列表(注意和apply传参的区别)。当一个参数为null或undefined的时候,函数中…

ubyntu 链接mysql_ubuntu mysql远程连接

ubuntu mysql远程连接http://blog.csdn.net/helen_shw/archive/2010/01/22/5224524.aspxkikikiki-desktop:/etc/apache2mysql error number 2003Cant connect to MySQL server xxx.xxx.xxx.xxx (10061)在ubuntu 9.04中默认安装了mysql,默认只能本地访问,…

js文章QQ空间分享

<!--示例一--> <div id"ckepop" classfeixiangjias> <a href"javascript:" class"jiathis jiathis_txt jtico jtico_jiathis" target"_blank">分享到&#xff1a;</a> <a class"jiathis_button_qzo…

JS高级——深入剖析函数中的this指向问题

一、this到底指向什么呢&#xff1f; 我们先说一个最简单的&#xff0c;this在全局作用域下指向什么&#xff1f; 这个问题非常容易回答&#xff0c;在浏览器中测试就是指向window 但是&#xff0c;开发中很少直接在全局作用于下去使用this&#xff0c;通常都是在函数中使用…

日志测试法

/*** 写入日志*/ function write2log($content,$filenamelog) {$myfile fopen($filename.".txt", "a") or die("Unable to open file!");$txt date(Y-m-d H:i:s)."\t".$content."\r\n";fwrite($myfile, $txt);fclose($myf…

JS高级——arguments参数详解

一、认识arguments arguments 是一个 对应于 传递函数的参数 的 类数组(array-like)对象。 array-like意味着它不是一个数组类型&#xff0c;而是一个对象类型&#xff1a; 但是它却拥有数组的一些特性&#xff0c;比如说length&#xff0c;比如可以通过index索引来访问&…

php 函数有命名空间吗_解析 ThinkPHP 的命名空间

php中文网最新课程每日17点准时技术干货分享大家都知道由于PHP语法里不支持函数重载机制&#xff0c;如果一个应用里有两个同名的方法&#xff0c;怎么办呢&#xff1f;在Yii 框架为了避免名字重复引起问题&#xff0c;全部的类前边都有 C 字样&#xff0c;而在ThinkPHP里就引入…

JS高级——纯函数、柯里化(手写自动柯里化函数)、组合函数(手写自动组合函数)

一、理解JavaScript纯函数 函数式编程中有一个非常重要的概念叫纯函数&#xff0c;JavaScript符合函数式编程的范式&#xff0c;所以也有纯函数的概念&#xff1b; 在react开发中纯函数是被多次提及的&#xff1b;比如react中组件就被要求像是一个纯函数&#xff08;为什么是…

(五)uboot移植补基础之shell

1、shell介绍&#xff1a;shell是操作系统的终端命令行 (1)shell可以理解为软件系统提供给用户操作的命令行界面&#xff0c;可以说它是人机交互的一种方式。(2)我们可以使用shell和操作系统、uboot等软件系统进行交互。具体来说就是我们通过shell给软件系统输入命令然后回车执…

三包围结构的字是什么样的_拼音带kun的字大全_50个拼音含kun的字组词

原标题&#xff1a;拼音带kun的字大全_50个拼音含kun的字组词1、昆(kūn)&#xff0c;8画&#xff0c;上下结构&#xff0c;部首&#xff1a;曰(日)组词&#xff1a;昆虫(kūn chng) | 昆曲(kūn qǔ) | 昆山(kūn shān) | 昆仲(kūn zhng) | 昆吾(kūn w) | 昆仑(kūn ln) |2…

JS高级——with语句、eval函数、严格模式

一、with语句 with语句的作用&#xff1a;扩展一个语句的作用域链。 不建议使用with语句&#xff0c;因为它可能是混淆错误和兼容性问题的根源。并且&#xff0c;在浏览器开启严格模式下&#xff0c;使用with会报错&#xff1a; 二、eval函数 eval是一个特殊的函数&#x…

写 一个PHP脚本遇到的问题总结

在项目中&#xff0c;因为之前的人员&#xff0c;基础数据没有处理好&#xff0c;后面需要写一个脚本来处理这个问题&#xff0c;经验少&#xff0c;总结如下&#xff1a;1.在linux下直接连接跑处理MySQL数据的脚本&#xff0c;要用PDO的方式连接数据库&#xff0c;长时间在框架…

nts包如何下周 php_windows下PHP7安装方法(ts版和nts版)

1.首先到官网下载PHP的Zip安装包http://windows.php.net/download/(1)VC14 x64 Non Thread Safe (2015-Dec-17 00:17:18)(2)VC14 x64Thread Safe (2015-Dec-17 00:17:17)下载的是这两个版本&#xff0c;可以分别解压到C盘根目录目录存放如下NTS: C:/phpTS:C:/php-tsVC14 需要自…

JS面向对象——Object.defineProperty

一、JavaScript的面向对象 JavaScript其实支持多种编程范式的&#xff0c;包括函数式编程和面向对象编程&#xff1a; JavaScript中的对象被设计成一组属性的无序集合&#xff0c;像是一个哈希表&#xff0c;有key和value组成&#xff1b;key是一个标识符名称&#xff0c;val…

Oracle Minus关键字

Oracle Minus关键字  SQL中的MINUS关键字  SQL中有一个MINUS关键字&#xff0c;它运用在两个SQL语句上&#xff0c;它先找出第一条SQL语句所产生的结果&#xff0c;然后看这些结果有没有在第二个SQL语句的结果 中。如果有的话&#xff0c;那这一笔记录就被去除&#xff0c;…

极大似然函数求解_极大似然估计法的理解指南

原标题&#xff1a;极大似然估计法的理解指南今天讲一个在机器学习中重要的方法——极大似然估计。这是一个&#xff0c;能够让你拥有拟合最大盈利函数模型的估计方法。01什么是极大似然估计法极大似然估计是 1821 年由高斯提出&#xff0c;1912 年由费希尔完善的一种点估计方法…

json字符串和字典类型的相互转换(转载)

转自&#xff1a;http://www.cnblogs.com/YUTOUYUWEI/p/5585863.html 在开发过程中&#xff0c;有时候需要将json字符串转为字典类型&#xff0c;反之亦然&#xff0c;通常采用.Net的开源类库Newtonsoft.Json进行序列化&#xff0c;这里我也是采用这个&#xff0c;不过我更喜欢…

JS高级——对象的原型__proto__、函数的原型prototype、构造函数

一、认识构造函数 我们先理解什么是构造函数&#xff1f; 构造函数也称之为构造器&#xff08;constructor&#xff09;&#xff0c;通常是我们在创建对象时会调用的函数&#xff1b;在其他面向的编程语言里面&#xff0c;构造函数是存在于类中的一个方法&#xff0c;称之为构造…

python各种数据类型的常用方法_Python之数据类型的常用方法

常用方法汇总1. int类方法汇总&#xff1a;变量名.to_bytes(数字&#xff0c;"little"\"big") # (把数字转换成bytes)# 数字表示转换后几个字节表示 little在前面&#xff0c;big在后面(大小端)int.from_bytes("要转换的东西","little"…

JS面向对象——原型链、通过原型链实现继承、借用构造函数实现继承

一、JavaScript原型链 在真正实现继承之前&#xff0c;我们先来理解一个非常重要的概念&#xff1a;原型链。 我们知道&#xff0c;从一个对象上获取属性&#xff0c;如果在当前对象中没有获取到就会去它的原型&#xff08;__proto__&#xff09;上面获取&#xff1a; 二、…