首页 > golang > Go语言中日志处理,log包的使用
2018
08-22

Go语言中日志处理,log包的使用

Golang提供了原生日志库“log”,使用简单方便,本文以代码为例进行说明介绍。

package main

import (
    "os"
    "log"
    "fmt"
)

func main() {
    // 打开日志文件
    // 第二个参数为打开文件的模式,可选如下:
    /*
    O_RDONLY // 只读模式打开文件
        O_WRONLY // 只写模式打开文件
        O_RDWR   // 读写模式打开文件
        O_APPEND // 写操作时将数据附加到文件尾部
        O_CREATE // 如果不存在将创建一个新文件
        O_EXCL   // 和O_CREATE配合使用,文件必须不存在
        O_SYNC   // 打开文件用于同步I/O
        O_TRUNC  // 如果可能,打开时清空文件
     */
     // 第三个参数为文件权限,请参考linux文件权限,664在这里为八进制,代表:rw-rw-r--
    logFile, err := os.OpenFile("e:/go.log", os.O_WRONLY | os.O_CREATE | os.O_APPEND, 0644)
    if err != nil {
        log.Fatal(err)
    }

    // 第一个参数为输出io,可以是文件也可以是实现了该接口的对象,此处为日志文件;第二个参数为自定义前缀;第三个参数为输出日志的格式选项,可多选组合
    // 第三个参数可选如下:
    /*
    Ldate         = 1             // 日期:2009/01/23
        Ltime         = 2             // 时间:01:23:23
        Lmicroseconds = 4             // 微秒分辨率:01:23:23.123123(用于增强Ltime位)
        Llongfile     = 8             // 文件全路径名+行号: /a/b/c/d.go:23
        Lshortfile    = 16            // 文件无路径名+行号:d.go:23(会覆盖掉Llongfile)
        LstdFlags     = Ldate | Ltime // 标准logger的初始值
     */
    debugLog := log.New(logFile, "[debug]", log.Ldate|log.Ltime|log.Llongfile)

    // 日志输出
    debugLog.Print("日志测试Print输出,处理同fmt.Print")
    debugLog.Println("日志测试Println输出,处理同fmt.Println")
    debugLog.Printf("日志测试%s输出,处理同fmt.Printf", "Printf")

    // 日志输出,同时直接终止程序,后续的操作都不会执行
    debugLog.Fatal("日志测试Fatal输出,处理等价于:debugLog.Print()后,再执行os.Exit(1)")
    debugLog.Fatalln("日志测试Fatalln输出,处理等价于:debugLog.Println()后,再执行os.Exit(1)")
    debugLog.Fatalf("日志测试%s输出,处理等价于:debugLog.Print()后,再执行os.Exit(1)", "Fatalf")

    // 日志输出,同时抛出异常,可用recover捕捉
    defer func() {
        if r := recover(); r != nil {
            fmt.Println("===========", r)
        }
    }()
    debugLog.Panic("日志测试Panic输出,处理等价于:debugLog.Print()后,再执行Panic()")
    debugLog.Panicln("日志测试Panicln输出,处理等价于:debugLog.Println()后,再执行Panic()")
    debugLog.Panicf("日志测试%s输出,处理等价于:debugLog.Printf()后,再执行Panic()", "Panicf")

    fmt.Println("前缀为:", debugLog.Prefix())    // 前缀为: [debug]
    fmt.Println("输出选项为:", debugLog.Flags()) // 输出选项为: 11
    // 设置前缀
    debugLog.SetPrefix("[info]")
    // 设置输出选项
    debugLog.SetFlags(log.LstdFlags)
    fmt.Println("前缀为:", debugLog.Prefix())    // 前缀为: [info]
    fmt.Println("输出选项为:", debugLog.Flags()) // 输出选项为: 3
}

说明:以上代码执行时要分段注释后执行,否则执行到:

debugLog.Fatal("日志测试Fatal输出,处理等价于:debugLog.Print()后,再执行os.Exit(1)")

便会终止

作者:golang中国
golang中国

本文》有 2014 条评论

留下一个回复