go語言讀取當前文件名行號和函數(shù)名

當我們需要打印日志的時候經(jīng)常會需要標示當前的代碼位置信息,包括所在文件名寓搬,行號凳宙,以及所在函數(shù)等等;特別是在處理log信息的時候茬故。

go語言提供的runtime和reflect庫可以幫助我們獲取這些信息盖灸。下面是一個重寫的log函數(shù)例子;自定義了一套log接口: ENTRY/EXIT/INFO/DEBUG等等磺芭,這些接口都是相似赁炎,所以代碼例子只給出了ENTRY和DEBUG

package main

import (
  "fmt"
  "log"
  "strings"
  "runtime"
 _"reflect"
  "path/filepath"
)

type MyStruct struct {
}

func (m *MyStruct) foo(p string) {
  ENTRY("")
  ENTRY("Param p=%s", p)
  DEBUG("Test %s %s", "Hello", "World")
}

func DEBUG(formating string, args... interface{}) {
  LOG("DEBUG", formating, args...)
}

func ENTRY(formating string, args... interface{}) {
  LOG("ENTRY", formating, args...)
}

func LOG(level string, formating string, args... interface{}) {
  filename, line, funcname := "???", 0, "???"
  pc, filename, line, ok := runtime.Caller(2)
  // fmt.Println(reflect.TypeOf(pc), reflect.ValueOf(pc))
  if ok {
      funcname = runtime.FuncForPC(pc).Name()       // main.(*MyStruct).foo
      funcname = filepath.Ext(funcname)             // .foo
      funcname = strings.TrimPrefix(funcname, ".")  // foo

      filename = filepath.Base(filename)  // /full/path/basename.go => basename.go
  }

  log.Printf("%s:%d:%s: %s: %s\n", filename, line, funcname, level, fmt.Sprintf(formating, args...))
}

func main() {
  ss := MyStruct{}
  ss.foo("helloworld")
}

編譯運行

$ go build main.go && ./main 
2017/09/24 09:37:29 main.go:17:foo: ENTRY: 
2017/09/24 09:37:29 main.go:18:foo: ENTRY: Param p=helloworld
2017/09/24 09:37:29 main.go:19:foo: DEBUG: Test Hello World

這樣在log里面可以清楚的看到輸出ENTRY/DEBUG語句所在的代碼信息,包括所在文件钾腺,行號徙垫,以及函數(shù)名。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末放棒,一起剝皮案震驚了整個濱河市姻报,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌间螟,老刑警劉巖吴旋,帶你破解...
    沈念sama閱讀 217,084評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件损肛,死亡現(xiàn)場離奇詭異,居然都是意外死亡荣瑟,警方通過查閱死者的電腦和手機治拿,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,623評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來笆焰,“玉大人劫谅,你說我怎么就攤上這事∪侣樱” “怎么了捏检?”我有些...
    開封第一講書人閱讀 163,450評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長不皆。 經(jīng)常有香客問我贯城,道長,這世上最難降的妖魔是什么粟焊? 我笑而不...
    開封第一講書人閱讀 58,322評論 1 293
  • 正文 為了忘掉前任冤狡,我火速辦了婚禮孙蒙,結(jié)果婚禮上项棠,老公的妹妹穿的比我還像新娘。我一直安慰自己挎峦,他們只是感情好香追,可當我...
    茶點故事閱讀 67,370評論 6 390
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著坦胶,像睡著了一般透典。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上顿苇,一...
    開封第一講書人閱讀 51,274評論 1 300
  • 那天峭咒,我揣著相機與錄音,去河邊找鬼纪岁。 笑死凑队,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的幔翰。 我是一名探鬼主播漩氨,決...
    沈念sama閱讀 40,126評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼遗增!你這毒婦竟也來了叫惊?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,980評論 0 275
  • 序言:老撾萬榮一對情侶失蹤做修,失蹤者是張志新(化名)和其女友劉穎霍狰,沒想到半個月后抡草,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,414評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡蚓耽,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,599評論 3 334
  • 正文 我和宋清朗相戀三年渠牲,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片步悠。...
    茶點故事閱讀 39,773評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡签杈,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出鼎兽,到底是詐尸還是另有隱情答姥,我是刑警寧澤,帶...
    沈念sama閱讀 35,470評論 5 344
  • 正文 年R本政府宣布谚咬,位于F島的核電站鹦付,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏择卦。R本人自食惡果不足惜敲长,卻給世界環(huán)境...
    茶點故事閱讀 41,080評論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望秉继。 院中可真熱鬧祈噪,春花似錦、人聲如沸尚辑。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,713評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽杠茬。三九已至月褥,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間瓢喉,已是汗流浹背宁赤。 一陣腳步聲響...
    開封第一講書人閱讀 32,852評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留栓票,地道東北人决左。 一個月前我還...
    沈念sama閱讀 47,865評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像逗载,于是被迫代替她去往敵國和親哆窿。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,689評論 2 354

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理厉斟,服務(wù)發(fā)現(xiàn)挚躯,斷路器,智...
    卡卡羅2017閱讀 134,654評論 18 139
  • 一擦秽、溫故而知新 1. 內(nèi)存不夠怎么辦 內(nèi)存簡單分配策略的問題地址空間不隔離內(nèi)存使用效率低程序運行的地址不確定 關(guān)于...
    SeanCST閱讀 7,808評論 0 27
  • 【讀經(jīng)】 耶5 【金句】 耶路撒冷啊码荔,你當洗去心中的惡漩勤,使你可以得救。惡念存在你心里要到幾時呢缩搅?(耶利米書 4:1...
    chanor閱讀 415評論 0 0
  • 下班路上刷朋友圈硼瓣,昨天剛加的“X”同學(xué)的一條圈圈吸引了我究飞。我欣賞“X”同學(xué)文筆的真實,故他的文字我都會看堂鲤∫诟担“X”同...
    晅飛飛閱讀 2,962評論 46 40
  • 摘要: 本文簡單介紹了如何利用Zipkin對SpringCloud應(yīng)用進行服務(wù)分析。在實際的應(yīng)用場景中瘟栖,Zipki...
    Zero___閱讀 1,010評論 0 3