go log

Posted tigerzhouv587

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了go log相关的知识,希望对你有一定的参考价值。

go自带log包

/*
golang log example
E-Mail : Mike_Zhang@live.com
*/
package main

import (
    "log"
    "os"
)

func main() 
    logFile,err := os.Create("test1.log")
    defer logFile.Close()
    if err != nil 
        log.Fatalln("open file error!")
    
    logger := log.New(logFile,"[Debug]",log.Ldate | log.Ltime | log.Lshortfile)
    logger.Println("test debug message")
    logger.SetPrefix("[Info]")
    logger.Println("test info message")

封装logger 一:

package main

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

var (
    Trace   *log.Logger // 记录所有日志
    Info    *log.Logger // 重要的信息
    Warning *log.Logger // 需要注意的信息
    Error   *log.Logger // 致命错误
)

func init() 
    file, err := os.OpenFile("file", 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.Ltime|log.Lshortfile)
    Info = log.New(os.Stdout, "Info: ", log.Ltime|log.Lshortfile)
    Warning = log.New(os.Stdout, "Warning: ", log.Ltime|log.Lshortfile)
    Error = log.New(io.MultiWriter(file, os.Stderr),  "Error", 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")

封装logger二:

package main

import (
    "bytes"
    "fmt"
    "log"
    "io"
    "io/ioutil"
    "os"
)
type Logger struct 
    // contains filtered or unexported fields
    
var (
    Trace   *log.Logger
    Info    *log.Logger
    Warning *log.Logger
    Error   *log.Logger
)

func Init( traceHandle io.Writer, infoHandle io.Writer, 
    warningHandle io.Writer, errorHandle io.Writer)(Trace,Info,Warning,Error *log.Logger) 
    Trace = log.New(traceHandle,"TRACE: ", log.Ldate|log.Ltime|log.Lshortfile)
    Info = log.New(infoHandle, "INFO: ", log.Ldate|log.Ltime|log.Lshortfile)
    Warning = log.New(warningHandle, "WARNING: ", log.Ldate|log.Ltime|log.Lshortfile)
    Error = log.New(errorHandle, "ERROR: ", log.Ldate|log.Ltime|log.Lshortfile)
    // Trace.Println("XXXXXXXXXXXX")
    return //Trace,Info,Warning,Error


func test_log2()
    Trace,Info,Warning,Error :=Init(ioutil.Discard, os.Stdout, os.Stdout, os.Stderr)
    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")


func test_log1()
    var buf bytes.Buffer
    logger := log.New(&buf, "logger: ", log.Lshortfile|log.Ldate)
    logger.Print("Hello, log file!")
    fmt.Print(&buf)


func main() 
    
    test_log1()
    test_log2()
    

go 切割日志文件

package main

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

const (
    BACKUP_COUNT = 5
    MAX_FILE_BYTES = 2 * 1024
)

func doRotate(fPrefix string) 
    for j := BACKUP_COUNT; j >= 1; j-- 
        curFileName := fmt.Sprintf("%s_%d.log",fPrefix,j)
        k := j-1
        preFileName := fmt.Sprintf("%s_%d.log",fPrefix,k)

        if k == 0 
            preFileName = fmt.Sprintf("%s.log", fPrefix)
        
        _,err := os.Stat(curFileName)
        if err == nil 
            os.Remove(curFileName)
            fmt.Println("remove : ", curFileName)
        
        _,err = os.Stat(preFileName)
        if err  == nil 
            fmt.Println("rename : ", preFileName, " => ", curFileName)
            err = os.Rename(preFileName, curFileName)
            if err != nil 
                fmt.Println(err)
            
        
    


func NewLogger(fPrefix string) (*log.Logger, *os.File) 
    var logger *log.Logger
    fileName := fmt.Sprintf("%s.log", fPrefix)
    fmt.Println("fileName :", fileName)
    logFile, err := os.OpenFile(fileName, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666)

    if err != nil 
        fmt.Println("open file error!")
     else 
        logger = log.New(logFile, "[Debug]", log.Ldate|log.Ltime|log.Lshortfile)
    
    return logger, logFile


func logWorker(msgQueue <-chan string) 
    fPrefix := "msg"
    logger, logFile := NewLogger(fPrefix)
    for msg := range msgQueue 
        logger.Println(msg)
        fi, err2 := logFile.Stat()
        if err2 == nil 
            if fi.Size() > MAX_FILE_BYTES 
                logFile.Close()
                doRotate(fPrefix)
                logger,logFile = NewLogger(fPrefix)
            
        
    
    logFile.Close()


func main() 
    msgQueue := make(chan string, 1000)
    go logWorker(msgQueue)

    for j := 1; j <= 1000; j++ 
        msgQueue <- fmt.Sprintf("msg_%d", j)
        time.Sleep(1 * time.Second)
    
    close(msgQueue)
    return

 

以上是关于go log的主要内容,如果未能解决你的问题,请参考以下文章

Go语言标准库之log包

Go日志库——log和logrus

Go语言开发Go语言常用标准库一

go语言碎片整理之标准库log

Log4Go 笔记

go语言实现log日志库