python:能自动记录时间,动作发生的所在文件和行数的日志类
tnLog.py
#!/usr/bin/env python # -*- coding: utf-8 -*- import os import sys import time import logging import inspect ''' import inspect def test(): a = inspect.stack()[1] print a 得到一个元组,如: (<frame object at 0x8604aa4>, 'test.py', 10, 'function_one', ['\t\tprint get_current_function_name()\n'], 0) a = inspect.stack()[1] 该行代码所在函数(被调函数)栈幀是0,根据调用的顺序,这个调用链条上的函数栈幀偏移值递增1
a -> b -> c (a调用b,b调用c)c中通过inspect获得栈幀集合,对于c来说
函数b的栈幀是inspect.stack()[1],函数a的栈幀是inspect.stack()[2]
那么这个元组的分别是:(调用者的栈对象,调用者的文件名,调用行数,调用者函数名,调用代码,0) 最后的0未知其含义 ''' class Logger(object): def printfNow(self): return time.strftime('%Y-%m-%d %H:%M:%S', time.localtime()) def __init__(self): self.__logger = logging.getLogger() path = os.path.abspath("/tmp/TNLOG-error.log") handler=logging.FileHandler(path) self.__logger.addHandler(handler) self.__logger.setLevel(logging.NOTSET) def getLogMessage(self,level,message): #message = "[%s] %s " %(self.printfNow(),message) frame,filename,lineNo,functionName,code,unknowField = inspect.stack()[2] '''日志格式:[时间] [类型] [记录代码] 信息''' return "[%s] [%s] [%s - %s - %s] %s" %(self.printfNow(),level,filename,lineNo,functionName,message) def info(self,message): message = self.getLogMessage("info",message) self.__logger.info(message) def error(self,message): message = self.getLogMessage("error",message) self.__logger.error(message) def warning(self,message): message = self.getLogMessage("warning",message) self.__logger.warning(message) def debug(self,message): message = self.getLogMessage("debug",message) self.__logger.debug(message) def critical(self,message): message = self.getLogMessage("critical",message) self.__logger.critical(message) #logger = consoleLog() if __name__ == "__main__": logger = Logger() logger.info("hello")
main.py
import sys import tnLog class X: def test(self): logger = tnLog.Logger() logger.info("hello") if __name__ == "__main__": x = X() x.test()
另外在python里可以读栈幀结构的库是traceback模块,不过使用这个模块需要先触发异常
镇宅神兽2012-08-14 14:48:47
被调函数怎么才能知道,是谁调用的我(调用我的函数,它的模块名,文件名,函数名,导致调用语句的行数)
镇宅神兽2012-08-14 14:48:55
在python里
salary-北京2012-08-14 16:28:57
>>> import inspect
>>> def f1(): f2()
...
>>> def f2():
... print '%s, %s' %(inspect.stack()[0][3],inspect.stack()[1][3])
...
>>> f1()
f2, f1
文武 pm 北京2012-08-14 16:30:36
正解
文武 pm 北京2012-08-14 16:30:42
看来大家都在玩儿python啊
GZ_change#小白2012-08-14 16:31:25
python这么好玩儿?
文武 pm 北京2012-08-14 16:31:39
那当然
文武 pm 北京2012-08-14 16:31:45
python干活真的很有效率
GZ_change#小白2012-08-14 16:31:53
昨天看 黑客 与画家
GZ_change#小白2012-08-14 16:32:14
动态语言,确实用着挺爽
镇宅神兽2012-08-14 17:38:33
我搞定了
GZ_change#小白2012-08-14 17:39:08
神马?
镇宅神兽2012-08-14 17:39:24
http://www.cnblogs.com/kill-signal/archive/2012/08/14/2638255.html
镇宅神兽2012-08-14 17:39:36
写的不错吧
镇宅神兽2012-08-14 17:39:56
我现在觉得,没有一定的LOG简直找死
镇宅神兽2012-08-14 17:40:07
调试个啥太困难了
GZ_change#小白2012-08-14 17:40:46
能用一句中文说明一下你的这篇博客写的是啥?
镇宅神兽2012-08-14 17:40:50
API,甚至全部函数都可以在入口把参数值记下来
镇宅神兽2012-08-14 17:41:32
这种东西,在后期排错帮助太大了
镇宅神兽2012-08-14 17:42:35
这么简单的东西要解释嘛
salary-北京2012-08-14 17:42:56
嗯,不错,值得学习。
GZ_change#小白2012-08-14 17:43:05
这个事情我也干过
GZ_change#小白2012-08-14 17:43:24
之前写一个单片机上面的数据存储管理模块
GZ_change#小白2012-08-14 17:43:35
不过都是手工写的打印函数
GZ_change#小白2012-08-14 17:43:37
printf
镇宅神兽2012-08-14 17:43:42
没有这些LOG,程序TMD就是一个黑盒
GZ_change#小白2012-08-14 17:44:09
你知道
GZ_change#小白2012-08-14 17:44:17
那些单片机是没有屏幕的
GZ_change#小白2012-08-14 17:44:29
调试程序,就是,把程序烧进去
GZ_change#小白2012-08-14 17:44:37
接上串口线
镇宅神兽2012-08-14 17:44:37
哪你能不能写文本文件呢
GZ_change#小白2012-08-14 17:44:43
不能
镇宅神兽2012-08-14 17:44:49
要对LOG封一层
GZ_change#小白2012-08-14 17:44:54
因为容量只有多少K而已
GZ_change#小白2012-08-14 17:45:03
而且,文件拷贝不出来
镇宅神兽2012-08-14 17:45:04
方便扩展行为
GZ_change#小白2012-08-14 17:45:08
只能烧程序进去
GZ_change#小白2012-08-14 17:45:15
所以,就只能靠printf
GZ_change#小白2012-08-14 17:45:28
打印到串口
镇宅神兽2012-08-14 17:45:28
如果这样的话,printf倒也可以接受
GZ_change#小白2012-08-14 17:45:35
在PC机器上看printf
GZ_change#小白2012-08-14 17:45:47
的数据
GZ_change#小白2012-08-14 17:45:59
太TM蛋疼了
GZ_change#小白2012-08-14 17:46:02
我去
镇宅神兽2012-08-14 17:46:39
武总,你们谁推荐个日志分析工具
镇宅神兽2012-08-14 17:47:47
整个系统应该遍布LOG
镇宅神兽2012-08-14 17:48:11
这样程序的状态才是可知,易排错的
镇宅神兽2012-08-14 17:48:24
最后,我们需要一个开关
镇宅神兽2012-08-14 17:48:53
系统稳定后可以少打一些LOG
posted on 2012-08-14 16:28 codestyle 阅读(1767) 评论(0) 编辑 收藏 举报
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· [AI/GPT/综述] AI Agent的设计模式综述