美文网首页Golang语言社区Go语言用例
go语言读取当前文件名行号和函数名

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

作者: CodingCode | 来源:发表于2017-09-24 09:43 被阅读331次

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

相关文章

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

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

  • Swift 如何获取当前代码的函数名和行号

    #file 用于获取当前文件文件名#line 用于获取当前行号#column 用于获取当前列编号#function...

  • Java中获取文件名、类名、方法名、行号的方法

      在C语言中,可以通过宏FILE、LINE来获取文件名和行号,在Java语言中,则可以通过StackTraceE...

  • php 魔术常量

    __LINE__ 文件中的当前行号 __FILE__ 文件的完整路径和文件名 __DIR__ ...

  • C语言打印错误信息

    目录 效果展示 有错误的时候会打印出错的文件名、出错的函数名和出错的行号 实现步骤 1.定义宏 2.创建测试函数 ...

  • 常用经验

    1.NSLog 调试打印日志,包括所在的文件名,函数名,行号。 原文:你真的理解你在用的自定义NSLog吗? 2....

  • Bugly iOS 符号表手动配置

    符号表是内存地址与函数名、文件名、行号的映射表。 符号表元素如下所示:<起始地址> <结束地址> <函数> [<文...

  • Goland软件调整

    GO语言 Goland软件调整 go语言开发不需要显示参数名字 搜索内容:Parameter hints 修改配置如下:

  • Go语言的主要特征

    Go语言的主要特征: Golang文件名: Go语言命名: 1.Go的函数、变量、常量、自定义类型、包(packa...

  • logrus中输出文件名、行号及函数名

    日志中输出文件名,行号及函数名是个比较有用的功能,那么在logrus中如何作到呢? 1. 在自带Formatter...

网友评论

    本文标题:go语言读取当前文件名行号和函数名

    本文链接:https://www.haomeiwen.com/subject/kpfkextx.html