日志
在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,用来将日志信息同时写入到多个输出中。 关于这个方法的更多说明,请点