python:能自動記錄時間,動作發生的所在檔案和行數的日誌類

來源:互聯網
上載者:User

tnLog.py

#!/usr/bin/env python# -*- coding: utf-8 -*-import osimport sysimport timeimport loggingimport inspect'''import inspectdef 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 sysimport tnLogclass 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

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.