【Python】自己写日志功能
Python有自带的logging模块,用于日志记录,功能很强大,但不好用,使用挺麻烦的,而且发现了几个bug,调用了一个logger.warning()一次,结果日志文件中出现了n行记录,且逐渐变成n+1,n+2,...越来越多。也不想去查原因,索性自己写一个日志功能。
我想要的日志的核心功能就只有两点:
1. 保存触发时间、异常堆栈信息。
2. 用文件形式保存。
上面第1点可以用Python自带的traceback模块实现,文件读写就很简单了。
MyLogger.py
import os
import time
import traceback class MyLogger:
def __init__(self,filename='./log/myapp.log'):#默认的日志文件为当前目录的子目录下的myapp.log文件
self.logfile=filename
path = filename[0:filename.rfind("/")]
if not os.path.isdir(path): # 无文件夹时创建
os.makedirs(path)
if not os.path.isfile(filename):
f=open(self.logfile,'w',encoding='utf-8')
f.close()
self.default_formator='{0},File {1},{2}():{3}\n' def get_invoker_info(self):
invoker_file=traceback.extract_stack()[-3].filename#调用本logger的代码的所在文件
invoker_func=traceback.extract_stack()[-3].name#调用本logger的代码(其实就是下面的log方法和error方法)所在的函数
return invoker_file,invoker_func
'''普通日志,保存任意信息,且也有堆栈信息'''
def log(self,msg=''):
t=time.strftime('%Y-%m-%d %H:%M:%S')
print('Log at:',t)
formator='Log at '+self.default_formator
#获取调用者信息
invoker_file,invoker_func=self.get_invoker_info()
content=formator.format(t,os.path.basename(invoker_file),invoker_func,msg)
self.append_log(content)
''''错误日志,报错的时候可以使用,加上了堆栈的形式'''
def error(self,msg=''):
t=time.strftime('%Y-%m-%d %H:%M:%S')
print('Error at:',t)
trace=traceback.format_exc()
#获取调用者信息
invoker_file,invoker_func=self.get_invoker_info()
formator='Error at '+self.default_formator+'{4}'
content=formator.format(t,os.path.basename(invoker_file),invoker_func,msg,trace)
self.append_log(content) def append_log(self,content):
f=open(self.logfile,'a',encoding='utf-8')
f.write(content)
#f.write('\n')
f.close() logger=MyLogger()
用法示例
logger_test.py
from MyLogger import logger def test():
try:
b=0
a=1/b
except Exception as e:
#logger.error('UU',exc_info=True)
logger.error(e)
logger.log('calling exception') if __name__=='__main__':
test()
logger.log('info')
打印的日志在log/myapp.log中的内容如下:
Error at 2019-12-31 19:18:48,File logger_test.py,test():division by zero
Traceback (most recent call last):
File "/Users/admin/Desktop/code/spyder_workspace/logger_test.py", line 13, in test
a=1/b
ZeroDivisionError: division by zero
Log at 2019-12-31 19:18:48,File logger_test.py,test():calling exception
Log at 2019-12-31 19:18:48,File logger_test.py,<module>():info
【Python】自己写日志功能的更多相关文章
- Atitit php java python nodejs错误日志功能的比较
Atitit php java python nodejs错误日志功能的比较 1.1. Php方案 自带 1 1.2. Java解决方案 SLF4J 1 1.3. Python解决方案 自带lo ...
- python接口测试之日志功能
之前在简书中看了一篇关于日志功能的文档,供大家参考:https://www.jianshu.com/p/62f7b49b41e7 Python通过logging模块提供日志功能,所以直接导入即可 im ...
- SSM框架中添加写日志功能
前提:要导入log4j的jar包 在web.xml中输入: <!--日志加载--> <context-param> <param-name>log4jConfigL ...
- Java Web项目实现写日志功能
第一步:导入log4j-1.2.16的jar包 第二步:在servlet包里编写写日志的servlet,代码如下: public class InitServlet extends HttpServl ...
- PHP里面增加写日志功能
配置项中:
- 关于Quartz.NET作业调度框架的一点小小的封装,实现伪AOP写LOG功能
Quartz.NET是一个非常强大的作业调度框架,适用于各种定时执行的业务处理等,类似于WINDOWS自带的任务计划程序,其中运用Cron表达式来实现各种定时触发条件是我认为最为惊喜的地方. Quar ...
- 使用python实现日志功能
Python脚本日志系统 Python通过logging模块提供日志功能,关于logging模块的使用网络上已经有很多详细的资料,这里要分享的是怎样在实际工程中使用日志功能. 假设要开发一个自动化 ...
- python语言(六)mock接口开发、发邮件、写日志、新Excel操作
一.urllib模块 urllib模块是一个标准模块,直接import urllib即可,在python3里面只有urllib模块,在python2里面有urllib模块和urllib2模块. url ...
- Python日志功能与处理逻辑
前言 在应用程序执行过程中,我们希望通过规范格式输出程序执行的详细信息,这时我们需要用到日志功能.在Python语言中,有个內建模块logging能够很好的实现日志功能.整体来说,logging配置可 ...
随机推荐
- three.js中的矩阵变换(模型视图投影变换)
目录 1. 概述 2. 基本变换 2.1. 矩阵运算 2.2. 模型变换矩阵 2.2.1. 平移矩阵 2.2.2. 旋转矩阵 2.2.2.1. 绕X轴旋转矩阵 2.2.2.2. 绕Y轴旋转矩阵 2.2 ...
- vue跳转的两种方法
1 标签跳转 <router-link to='two'><button>点我到第二个页面</button></router-link> 2 点击事件跳 ...
- Fibonacci相关问题
公式如下: 递归的解法我就不写了,贴一个递推的. long long Fibonacci(unsigned int n) { ) ; ) ; ; ; long long res; ; i <= ...
- jQuery中的查找节点、创建节点、插入节点、删除节点、替换节点、复制节点操作方法
jQuery操作节点我们可以分六点来讲,查找节点.创建节点.插入节点.删除节点.替换节点.复制节点. 一.查找节点 text() - 设置或返回所选元素的文本内容 ,html() - 设置或返回所 ...
- High Card Low Card G(田忌赛马进阶!!)
传送门 \(首先一定要明确一个观点,不然会完全没有思路\) \(\bullet\)\(由于前半段大的更优,后半段小的更优.\) \(\bullet\)\(所以,\)Bessie\(一定会在前(n/2) ...
- HDU1300Pearls
传送门 描述: 有几种不同的珍珠.每种珍珠都有它的单价.当然质量高的珍珠价格一定也是高的. 为了避免买家只买1个珍珠.就要求不论是买了多少个珍珠都是需要在购买数量上加10.之后乘上单价. 例如:买5个 ...
- sprign mvc 解决中文乱码问题
解决get乱码问题 解决get请求的乱码需要在tomcat中解决,需要找到tomcat 的conf/server.xml: 解决post乱码问题 解决post乱码问题需要在spring 的主配置文件总 ...
- Android自定义顶部栏及侧滑菜单和fragment+viewpag滑动切换的实现
嘿嘿嘿,关于android滑动的操作,是不是经常都会用到呢. 我肯定也要学习一下啦. https://blog.csdn.net/u013184970/article/details/82882107 ...
- salesforce零基础学习(九十七)Event / Task 针对WhoId的浅谈
我们在Sales Cloud中经常会创建顾客,如果针对TO C业务,会启用个人顾客,比如针对车企行业,有一些场景是需要卖给个人的,而不只是企业采购.当通过打电话或者其他的场景有潜在客户并且转换成客户以 ...
- 【Hadoop离线基础总结】zookeeper的介绍以及集群环境搭建、网络编程和RPC的简单了解
ZooKeeper的介绍以及集群环境搭建.网络编程和RPC的简单了解 ZooKeeper介绍 概述 ZooKeeper是一个分布式协调服务的开源框架,主要用来解决分布式集群中应用系统的一致性问题.例如 ...