Fatal 系列函数(log.Fatalln)用来写日志消息,然后使用 os.Exit(1)终止程序。
Panic 系列函数(log.Panicln)用来写日志消息,然后触发一个 panic。
日志记录器是多 goroutine 安全的

// This sample program demonstrates how to create customized loggers.
package main

import (
"io"
"io/ioutil"
"log"
"os"
)

var (
Trace *log.Logger // Just about anything
Info *log.Logger // Important information
Warning *log.Logger // Be concerned
Error *log.Logger // Critical problem
)

func init() {
file, err := os.OpenFile("errors.txt",
os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
if err != nil {
log.Fatalln("Failed to open error log file:", err)
}

Trace = log.New(ioutil.Discard,
"TRACE: ",
log.Ldate|log.Ltime|log.Lshortfile)

Info = log.New(os.Stdout,
"INFO: ",
log.Ldate|log.Ltime|log.Lshortfile)

Warning = log.New(os.Stdout,
"WARNING: ",
log.Ldate|log.Ltime|log.Lshortfile)

Error = log.New(io.MultiWriter(file, os.Stderr),
"ERROR: ",
log.Ldate|log.Ltime|log.Lshortfile)
}

func main() {
Trace.Println("I have something standard to say")
Info.Println("Special Information")
Warning.Println("There is something you need to know about")
Error.Println("Something has failed")
}

首先为 4 个日志等级声明了 4 个 Logger 类型的指针变量;

其次使用 log 包的 New 函数, 创建并正确初始化四个Logger 类型的值,函数 New 会返回新创建的值的地址,赋值给四个变量。

最后直接调用Trace.Println

Logger.New函数的声明:

// New 创建一个新的 Logger。 
// out 参数设置日志数据将被写入的目的地
// 参数 prefix 会在生成的每行日志的最开始出现
// 参数 flag 定义日志记录包含哪些属性
func New(out io.Writer, prefix string, flag int) *Logger {
return &Logger{out: out, prefix: prefix, flag: flag}
}

ioutil.Discard 是一个 io.Writer,所有的 Write 调用都不会有动作,但是会成功返回;

io.MultiWriter 可以同时向多个 Writer 做输出。