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】自己写日志功能的更多相关文章

  1. Atitit php java python nodejs错误日志功能的比较

    Atitit php  java  python  nodejs错误日志功能的比较 1.1. Php方案 自带 1 1.2. Java解决方案 SLF4J 1 1.3. Python解决方案 自带lo ...

  2. python接口测试之日志功能

    之前在简书中看了一篇关于日志功能的文档,供大家参考:https://www.jianshu.com/p/62f7b49b41e7 Python通过logging模块提供日志功能,所以直接导入即可 im ...

  3. SSM框架中添加写日志功能

    前提:要导入log4j的jar包 在web.xml中输入: <!--日志加载--> <context-param> <param-name>log4jConfigL ...

  4. Java Web项目实现写日志功能

    第一步:导入log4j-1.2.16的jar包 第二步:在servlet包里编写写日志的servlet,代码如下: public class InitServlet extends HttpServl ...

  5. PHP里面增加写日志功能

    配置项中:

  6. 关于Quartz.NET作业调度框架的一点小小的封装,实现伪AOP写LOG功能

    Quartz.NET是一个非常强大的作业调度框架,适用于各种定时执行的业务处理等,类似于WINDOWS自带的任务计划程序,其中运用Cron表达式来实现各种定时触发条件是我认为最为惊喜的地方. Quar ...

  7. 使用python实现日志功能

    Python脚本日志系统   Python通过logging模块提供日志功能,关于logging模块的使用网络上已经有很多详细的资料,这里要分享的是怎样在实际工程中使用日志功能. 假设要开发一个自动化 ...

  8. python语言(六)mock接口开发、发邮件、写日志、新Excel操作

    一.urllib模块 urllib模块是一个标准模块,直接import urllib即可,在python3里面只有urllib模块,在python2里面有urllib模块和urllib2模块. url ...

  9. Python日志功能与处理逻辑

    前言 在应用程序执行过程中,我们希望通过规范格式输出程序执行的详细信息,这时我们需要用到日志功能.在Python语言中,有个內建模块logging能够很好的实现日志功能.整体来说,logging配置可 ...

随机推荐

  1. Jenkins 介绍

    持续集成: 持续集成是一种软件开发实践,即团队开发成员经常集成他们的工作,通过每个成员每天至少集成一次,也就意味着每天可能会发生多次集成.每次集成都通过自动化的构建(包括编译,发布,自动化测试)来验证 ...

  2. 这么多Linux版本,你究竟该怎么选择?

    Linux有非常多的版本,比如世面上常见的有 Ubuntu.RedHat.Fedora.Centos等等,这么多的版本我们究竟该选哪一个呢?今天我带大家对各个版本进行一下分析和比较,帮助大家来做出更好 ...

  3. properties文件导出

    功能要求根据数据库记录的key-value-remark 数据,导出保存properties文件 1. pro.load()  pro.list() 处理不能解决备注.排序问题 2. 最后考虑下什么是 ...

  4. abp web.mvc项目中的菜单加载机制

    abp中的菜单加载机制 在abp中菜单的定义与我们传统写的框架不一样,它是在编写代码的时候配置,而我们一般写的通用权限管理系统中,是后期在后台界面中添加的.这一点有很大不同.abp关于菜单的定义及管理 ...

  5. 学习python的第一天,python的简单知识

    python 是现如今比较火的一种编程语言.在抱着试试的态度我来进行学习下python.要学习python 要先进行环境的安装. 下面是下载链接:https://pan.baidu.com/s/1PW ...

  6. git工作中最常用的用法教程,不走命令行

    ·1.1 git的概述 Git(读音为/gɪt/.)是一个开源的分布式版本控制系统,可以有效.高速的处理从很小到非常大的项目版本管理.  Git 是 Linus Torvalds 为了帮助管理 Lin ...

  7. php反序列化(昨天的补充)

    魔术方法 在对PHP反序列化进行利用时,经常需要通过反序列化中的魔术方法,检查方法里是否有敏感操作来进行利用. 常见方法: 创建对象时触发:__construct() 对象被销毁时触发:__destr ...

  8. vue登录路由验证(转)

    转载自:https://blog.csdn.net/github_39088222/article/details/80749219 vue的项目的登录状态(如果用vuex状态管理,页面一刷新vuex ...

  9. 快手4-5月Java岗面经

    快手面试准备 我的牛客网帖子链接:https://www.nowcoder.com/discuss/429362 一面: 基础知识 1.java基本数据类型(8种) 1.基本数据类型有哪些,各占多少位 ...

  10. 9.4 Go 数据格式

    9.4 Go 数据格式 1.1. msgpack格式 官方msgpack官网用一句话总结: It’s like JSON. but fast and small. 简单来讲,它的数据格式与json类似 ...