9.日志(log)文件
最后更新于:2022-04-02 04:46:09
import "log"
log包实现了简单的日志服务。本包定义了Logger类型,该类型提供了一些格式化输出的方法。本包也提供了一个预定义的“标准”Logger,可以通过辅助函数Print[f|ln]、Fatal[f|ln]和Panic[f|ln]访问,比手工创建一个Logger对象更容易使用。
Logger会打印每条日志信息的日期、时间,默认输出到标准错误。
Fatal系列函数会在写入日志信息后调用os.Exit(1)。
Panic系列函数会在写入日志信息后panic。
Print 示例:
~~~
package main
import "log"
func main() {
log.Print("this is log print test", "\n")
log.Printf("this is %s", "log printf test\n")
log.Printf("this is log println test")
}
~~~
运行结果:
~~~
2018/04/12 14:03:37 this is log print test
2018/04/12 14:03:37 this is log printf test
2018/04/12 14:03:37 this is log println test
~~~
对于 log.Fatal 接口,会先将日志内容打印到标准输出,接着调用系统的 os.exit(1) 接口,退出程序并返回状态 1 。
但是有一点需要注意,由于是直接调用系统接口退出,defer函数不会被调用。
Fatal 示例:
~~~
package main
import (
"fmt"
"log"
)
func main() {
defer func() {
fmt.Println("first defer")
}()
log.Fatal("this is log fatal test", "\n")
log.Fatalf("this is %s", "log fatalf test\n")
log.Fatalln("this is log fatalln test\n")
defer func() {
fmt.Println("second defer")
}()
}
~~~
运行结果:
~~~
2018/04/12 14:12:01 this is log fatal test
exit status 1
~~~
Panic 示例:
~~~
package main
import (
"fmt"
"log"
)
func main() {
defer func() {
fmt.Println("first defer")
if err := recover(); err != nil {
fmt.Println(err)
}
}()
log.Panic("this is log panic")
defer func() {
fmt.Println("second defer")
}()
}
~~~
运行结果:
~~~
2018/04/12 14:36:02 this is log panic
first defer
this is log panic
~~~
生成日志(log)文件
~~~
func New(out io.Writer, prefix string, flag int) *Logger
/*
New创建一个Logger。参数out设置日志信息写入的目的地。
参数prefix会添加到生成的每一条日志前面。参数flag定义日志的属性(时间、文件等等)。
*/
func (l *Logger) SetPrefix(prefix string)
// SetPrefix设置logger的输出前缀。
func (l *Logger) SetFlags(flag int)
// SetFlags设置logger的输出选项。
const (
// 字位共同控制输出日志信息的细节。不能控制输出的顺序和格式。
// 在所有项目后会有一个冒号:2009/01/23 01:23:23.123123 /a/b/c/d.go:23: message
Ldate = 1 << iota // 日期:2009/01/23
Ltime // 时间:01:23:23
Lmicroseconds // 微秒分辨率:01:23:23.123123(用于增强Ltime位)
Llongfile // 文件全路径名+行号: /a/b/c/d.go:23
Lshortfile // 文件无路径名+行号:d.go:23(会覆盖掉Llongfile)
LstdFlags = Ldate | Ltime // 标准logger的初始值
)
// 这些选项定义Logger类型如何生成用于每条日志的前缀文本。
~~~
代码实力:
~~~
package main
import (
"fmt"
"log"
"os"
)
func Debug(logName string) {
logFile, err := os.OpenFile(logName, os.O_CREATE|os.O_APPEND|os.O_RDWR, 0666)
if err != nil {
fmt.Printf("create ./test.log err : %v\n", err)
}
if logFile != nil {
defer func(file *os.File) { file.Close() }(logFile)
}
debugLog := log.New(logFile, "[Debug]", log.Ldate)
debugLog.SetPrefix("[Debug]")
debugLog.SetFlags(log.Lshortfile)
debugLog.Println("this is Debug log")
}
func Waring(logName string) {
logFile, err := os.OpenFile(logName, os.O_CREATE|os.O_APPEND|os.O_RDWR, 0666)
if err != nil {
fmt.Printf("create ./test.log err : %v\n", err)
}
if logFile != nil {
defer func(file *os.File) { file.Close() }(logFile)
}
debugLog := log.New(logFile, "[Waring]", log.Ldate)
debugLog.SetPrefix("[Waring]")
debugLog.SetFlags(log.Lshortfile)
debugLog.Println("this is Waring log")
}
func main() {
logName := "./test.log"
Debug(logName)
Waring(logName)
}
~~~
';