Golang中使用log(一):Golang 标准库提供的Log
Golang的标准库提供了log的机制,但是该模块的功能较为简单(看似简单,其实他有他的设计思路)。不过比手写fmt. Printxxx还是强很多的。至少在输出的位置做了线程安全的保护。其官方手册见Golang log (天朝的墙大家懂的)。这里给出一个简单使用的例子:
package main import ( "log" ) func main(){ log.Fatal("Come with fatal,exit with 1 n") }
编译运行后,会看到程序打印了 一般接口Golang's log模块主要提供了3类接口。分别是 “Print 、Panic 、Fatal ”。当然是用前先包含log包。 import( "log" ) 为了方便是用,Golang和Python一样,在提供接口时,提供一个简单的包级别的使用接口。不同于Python,其输出默认定位到标准错误 可以通过 对每一类接口其提供了3中调用方式,分别是 "Xxxx 、 Xxxxln 、Xxxxf" 比如对于Print就有: log.Print log.Printf log.Println
这里是以 “Print”来具体说明的,对于“Panic”和“Fatal”也是一样的。下面再以"Print"为例,看下调用方式: package main import ( "log" ) func main(){ arr := []int {2,3} log.Print("Print array ",arr,"n") log.Println("Println array",arr) log.Printf("Printf array with item [%d,%d]n",arr[0],arr[1]) } 会得到如下结果: 2014/05/02 12:27:19 Print array [2 3] 2014/05/02 12:27:19 Println array [2 3] 2014/05/02 12:27:19 Printf array with item [2,3] 输出中的日期和时间是默认的格式,如果直接调用简单接口,其格式是固定的,可以通过
看完了 比较复杂的是 package main import ( "log" "fmt" ) func main(){ defer func(){ if e:= recover();e!= nil { fmt.Println("Just comming recover") fmt.Println("e from recover is :",e) fmt.Println("After recover") } }() arr := []int {2,3} log.Panic("Print array ","n") } 结果为:
2014/05/03 13:52:42 Print array [2 3] Just comming recover e from recover is : Print array [2 3] After recover 从结果我们可以看出,是先将日志刷入标准输出,然后通过defer里面的recover进行捕获panic的内容。 自定义Logger类型理清了“Print 、Panic 、Fatal ”后我们就好介绍 func New(out io.Writer,prefix string,flag int) *Logger 其初始化条件分别是日志写入的位置 out ,日志的前缀内容 prefix ,以及日志的内容flag。可以通过上面介绍的
Ldate = 1 << iota // the date: 2009/01/23 形如 2009/01/23 的日期 Ltime // the time: 01:23:23 形如 01:23:23 的时间 Lmicroseconds // microsecond resolution: 01:23:23.123123. 形如01:23:23.123123 的时间 Llongfile // full file name and line number: /a/b/c/d.go:23 全路径文件名和行号 Lshortfile // final file name element and line number: d.go:23. overrides Llongfile 文件名和行号 LstdFlags = Ldate | Ltime // 日期和时间 表示在日志内容开头,我们暂且称之为日志抬头,打印出相关内容。对于上面的默认格式就是 LstdFlags 打印出日期和时间。 该方法还定义了如上一些同名方法。 func (l *Logger) Print(v ...interface{}) func (l *Logger) Printf(format string,v ...interface{}) func (l *Logger) Println(v ...interface{}) func (l *Logger) Fatal(v ...interface{}) func (l *Logger) Fatalf(format string,v ...interface{}) func (l *Logger) Fatalln(v ...interface{}) func (l *Logger) Panic(v ...interface{}) func (l *Logger) Panicf(format string,v ...interface{}) func (l *Logger) Panicln(v ...interface{}) func (l *Logger) Flags() int func (l *Logger) Prefix() string func (l *Logger) SetFlags(flag int) func (l *Logger) SetPrefix(prefix string) 其中 “Print 、Panic 、Fatal ” 系列函数和之前介绍的一样,Flags和Prefix分别可以获得log.Logger当前的日志抬头和前缀。 SetFlags ,SetPrefix 则可以用来设置日志抬头和前缀。 使用实例最后我看有log模块将debug日志打印到文件的实例。 package main import ( "log" "os" ) func main(){ fileName := "xxx_debug.log" logFile,err := os.Create(fileName) defer logFile.Close() if err != nil { log.Fatalln("open file error !") } debugLog := log.New(logFile,"[Debug]",log.Llongfile) debugLog.Println("A debug message here") debugLog.SetPrefix("[Info]") debugLog.Println("A Info Message here ") debugLog.SetFlags(debugLog.Flags() | log.LstdFlags) debugLog.Println("A different prefix") } 运行后打开日志文件我们可以看到相应的日志内容 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |