日志

在go语言中,内置了日志工具包来方便开发者记录日志信息。go语言中,关于日志的操作都在log包中。

log的常用方法介绍

  • log.SetPrefix(prefix string) : 设置日志输出的前缀
  • log.SetFlags(flag int) : 设置日志标志,这个标志用来控制输出到日志中的其他信息,包括日期,时间,文件的路径名和行号,最终的文件名和行号等信息。
  • log.SetOutput(w io.Writer) :设置输出位置,参数是一个io的写入流
  • log.Fatalln(v ...interface{}) :输出致命的错误,然后退出程序。参数可以是任意类型,可变长度参数。
  • log.Panicln(v ...interface{}) :输出警告信息。参数可以是任意类型,可变长度参数。
  • log.Println(v ...interface{}) :输出正常的日志信息,参数可以是任意类型,可变长度参数。
package main

import (
	"log"
)

func init(){
  //设置日志前缀
	log.SetPrefix("日志:")
  //设置标志,这里设置了让日志信息中添加日期,时间,文件的短路径名称信息
	log.SetFlags(log.Ldate | log.Lshortfile | log.Ltime)
}

func main(){
	log.Println("这是日志信息。。");
}
//日志:2017/10/02 13:41:38 main.go:13: 这是日志信息。。
复制代码

再来看下面的代码:

package main

import (
	"log"
)

func init(){
	log.SetPrefix("日志:")
	log.SetFlags(log.Ldate | log.Lshortfile | log.Ltime)
}

func main(){
	log.Println("这是正常的日志信息。。")
	log.Fatalln("致命的错误日志信息。。")
	log.Panicln("警告的日志信息。。")
}
//日志:2017/10/02 13:44:49 main.go:13: 这是正常的日志信息。。
//日志:2017/10/02 13:44:49 main.go:14: 致命的错误日志信息。。
//exit status 1
复制代码

从上面的执行结果可以看出,在调用了Fatalln方法之后,程序会退出执行。所以下面一行的代码也就无法执行了。

package main

import (
	"io"
	"log"
	"os"
)

func init(){
	log.SetPrefix("日志:")
	log.SetFlags(log.Ldate | log.Lshortfile | log.Ltime)
}

func main(){
	file ,_ := os.OpenFile("errors.txt",os.O_WRONLY,0666)

	log.SetOutput(io.Writer(file))

	log.Println("这个日志将会输出到文件中")
}
复制代码

上面的代码设置了log的输出,将日志输出到文件errors中了。代码在执行后就会在文件errors.txt中添加日志信息。 其中os.OpenFile方法用来打开一个文件,更多说明请点



自定义日志记录器

在其他语言中,我们记录日志的时候一般会用到info,warn,error等方法来输出各种不同级别的日志信息。在go中,我们也可以实现这样的日志记录器。

package main

import (
	"io"
	"log"
	"os"
)

//声明3个变量,用来记录不同的日志信息
var Info *log.Logger
var Warn *log.Logger
var Error *log.Logger

//初始化
func init(){
	Info = log.New(os.Stdout,"Info:",log.Ldate | log.Ltime | log.Lshortfile)
	Warn = log.New(os.Stdout,"Warn:",log.Ldate | log.Ltime | log.Lshortfile)
	
	file , err := os.OpenFile("errors.txt",os.O_APPEND |os.O_WRONLY,0666)
	//如果打开错误日志文件失败
	if err != nil{
		log.Fatalln("打开日志文件失败。。")
	}
	//初始化错误日志记录器Error
	Error = log.New(io.MultiWriter(os.Stderr,file),"Error:",log.Ldate | log.Ltime | log.Lshortfile)
}

func main(){
	Info.Println("info日志")
	Warn.Println("warn日志")
	Error.Println("error日志")
}

//Info:2017/10/02 14:32:56 main.go:29: info日志
//Warn:2017/10/02 14:32:56 main.go:30: warn日志
//Error:2017/10/02 14:32:56 main.go:31: error日志
复制代码

上面的代码运行之后,会在控制台输出上面的内容,同时会在errors.txt文件中,加入“Error:2017/10/02 14:32:56 main.go:31: error日志” 信息。io.MultiWriter方法用来创建一个Writer对象,这个对象会将写入提供给参数中定义的每一个writer,用来将日志信息同时写入到多个输出中。 关于这个方法的更多说明,请点