码迷,mamicode.com
首页 > 其他好文 > 详细

go log

时间:2019-09-10 18:08:07      阅读:93      评论:0      收藏:0      [点我收藏+]

标签:ati   info   set   open   count   class   printf   lse   exp   

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

标签:ati   info   set   open   count   class   printf   lse   exp   

原文地址:https://www.cnblogs.com/tigerzhouv587/p/11498630.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!