go语言读取当前文件名行号和函数名

当我们需要打印日志的时候经常会需要标示当前的代码位置信息,包括所在文件名,行号,以及所在函数等等;特别是在处理log信息的时候。

go语言提供的runtime和reflect库可以帮助我们获取这些信息。下面是一个重写的log函数例子;自定义了一套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语句所在的代码信息,包括所在文件,行号,以及函数名。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,845评论 18 139
  • 一、温故而知新 1. 内存不够怎么办 内存简单分配策略的问题地址空间不隔离内存使用效率低程序运行的地址不确定 关于...
    SeanCST阅读 7,865评论 0 27
  • 【读经】 耶5 【金句】 耶路撒冷啊,你当洗去心中的恶,使你可以得救。恶念存在你心里要到几时呢?(耶利米书 4:1...
    chanor阅读 436评论 0 0
  • 下班路上刷朋友圈,昨天刚加的“X”同学的一条圈圈吸引了我。我欣赏“X”同学文笔的真实,故他的文字我都会看。“X”同...
    晅飞飞阅读 2,974评论 46 40
  • 摘要: 本文简单介绍了如何利用Zipkin对SpringCloud应用进行服务分析。在实际的应用场景中,Zipki...
    Zero___阅读 1,040评论 0 3