简单封装了下go log,四个日志等级,能满足基本业务需求,通过github.com/robfig/cron可以每天生成一个日志文件

package logger

import (
    "io"
    "log"
    "os"
)

const (
    LTrace = iota
    LInfo
    LWarn
    LError
)

var (
    file  *os.File
    Trace *log.Logger
    Info  *log.Logger
    Warn  *log.Logger
    Error *log.Logger
)

func newLevel(file *os.File, level, curLevel int) *log.Logger {
    var flag int = (log.Ldate | log.Lmicroseconds | log.Lshortfile)
    logNew := func(prefix string, l1, l2 int) *log.Logger {
        if l1 <= l2 {
            return log.New(io.MultiWriter(file, os.Stdout), prefix, flag)
        } else {
            return log.New(os.Stdout, prefix, flag)
        }
    }

    switch level {
    case LTrace:
        return logNew("[TRACE] ", curLevel, LTrace)
    case LInfo:
        return logNew("[INFO ] ", curLevel, LInfo)
    case LWarn:
        return logNew("[WARN ] ", curLevel, LWarn)
    case LError:
        return logNew("[ERROR] ", curLevel, LError)
    default:
        return logNew("[TRACE] ", curLevel, LTrace)
    }
}

func Init(path string, level int) error {
    var oldFile = file
    file, err := os.OpenFile(path, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
    if err != nil {
        return err
    }
    Trace = newLevel(file, LTrace, level)
    Info = newLevel(file, LInfo, level)
    Warn = newLevel(file, LWarn, level)
    Error = newLevel(file, LError, level)

    if oldFile != nil {
        oldFile.Close()
    }
    return nil
}

在cron中初始化,每天凌晨生成一个新的日志文件

package schedule

import (
    "fmt"
    "ningtogo/app/logger"
    "time"

    "github.com/robfig/cron"
)

var (
    c *cron.Cron
)

func init() {
    c = cron.New()
    c.AddFunc("0 0 0 * * *", func() {
        initLogger()
    })
    c.Start()
    initLogger()
}

func initLogger() {
    logPath := fmt.Sprintf("logs/ningtogo_%s.log", time.Now().Format("20060102"))
    if err := logger.Init(logPath, logger.LTrace); err != nil {
        fmt.Println("init logger failed", err)
    } else {
        logger.Info.Println("logger init success")
    }
}

使用:

package main

import (
    "fmt"
    "os"

    "./logger"
)

func init() {
    if err := logger.Init("test.log", logger.LInfo); err != nil {
        fmt.Println("init logger failed", err)
        os.Exit(1)
    }
}

func main() {
    logger.Trace.Println("trace message")
    logger.Info.Println("info message")
    logger.Warn.Println("warn message")
    logger.Error.Println("error message")
}

发表评论

电子邮件地址不会被公开。 必填项已用*标注

鄂ICP备17003086号. Copyright © 2016. All Rights Reserved.