Golang的log模块可谓是语言层面上非常基础的一层库,反应的是语言本身的特征而不是一个服务应该怎样怎样。为了方便自己写 应用,我按照自己的需求提出一些log的API并重新实现。和Golang的log模块形成互补。

自己的log模块设计

对于我自己的log模块,暂时不需要log4j里面复杂的配置系统,也就不需要父子继承的命名约定。我需要这样一套系统。在主模块中或者基础模块中进行日志的初始化,在需要使用日志的其他模块中通过GetLogger(log String)获得我初始化过的日志,然后通过分等级的 API记录不同等级的Log。日志的抬头可以通过设置为几种最常用的模式,无需从配置文件中进行复制控制。不同等级的日志可以定位到 不同的输出目的地从而便于分析。可以控制的DEBUG日志。log本身不做exit、panic处理,保持透明,留给用户自己选择。

1。日志分级

DEBUG INFO WARNING TRACE ERROR FATAL

2.统一设置

NewLogger(path,baseName,logName String,level Level)(Error)LogGet(logName String )(* Logger)LogClear(logName String)

3.一致的打log接口

提供一个包级接口。使用一个默认的Logger对象作为载体。输出到标准输出,其中ERROR和FATAL等级的输出到标准错误。

log.DEBUG(format,v ... interface{})
log.INFO(format,v... interface{})
log.WARNNING(format,v... interface{})
log.TRACE(format,v... interface{})
log.ERROR(format,v... interface{})
log.FATAL(format,v... interface{})

默认的日志格式为 "[NAME][LEVEL][file full path & line number]: log content。

以上接口类似与Printf并可以自动换行,若将format置为""-空字符串,则表现的类似Println可以自动识别出自定义复杂类型,无需人工进行格式定义,行尾自动换行。

通过GetLogger得到的对象类型为

type Logger struct{
    // something here
}

该对象也实现了上述接口: Logger.DEBUG(format,v ... interface{}) Logger.INFO(format,v... interface{}) Logger.WARNNING(format,v... interface{}) Logger.TRACE(format,v... interface{}) Logger.ERROR(format,v... interface{}) Logger.FATAL(format,v... interface{})

同样format为空字符串时表现类似Println。对Logger对象的操作需要首先调用LogInit进行初始化。接口会根据level选择是否进行输出。level 分为:

DEBUG INFO WARNING TRACE ERROR FATAL

等级依次增高。level之前的等级不做输出。

4.看一个实际的例子

package main
import (
    "github.com/cz-it/log4golang/log"
    "fmt"
)
func main(){
    fmt.Println("Testing:")
    err := log.Init()
    if err != nil{
        panic("log init error")
    }
    logger := log.NewLogger("./a/b","test","nimei",log.DEBUG)
    logger.Debug("logger's debug")
    logger.Info("logger's info")
    logger.Warning("logger's Waring")
    logger.Trace("logger's Trace")
    logger.Error("logger's error")
    logger.Fatal("logger's fatal")
    log.Debug("Debug")
    log.Info("Info")
    log.Warning("Warning")
    log.Trace("Trace")
    log.Error("Error")
    log.Fatal("fatal end")
    log.Debug("","logger is",logger)
}
log.Initlog.NewLogger
log.GetLogger

代码源文件可以clone这里