转载自​​LINK​


目录


默认的go logger

默认的​​log​​​不支持日志分级,没有​​INFO,DEBUG,ERROR​​之分

package main

import (
"log"
"net/http"
"os"
)

func initlog(){
logFileLocation, _ := os.OpenFile("./test.log", os.O_CREATE|os.O_RDWR|os.O_TRUNC, 0744) //创建一个可读写的文件,且覆盖掉以前的内容
log.SetOutput(logFileLocation) //设置输出的文件
}
func testlog( url string ){
resp, err := http.Get( url )
if err != nil{
log.Printf("Error fetching url %s : %s", url, err.Error() )
}else{
defer resp.Body.Close()
log.Printf("Status code for %s : %s",url,resp.Status )
}
}
func main(){
initlog()
testlog("https://www.acwing.com/")
}

Zap Logger

​Zap​​​是非常快的、结构化的,分日志级别的​​Go​​日志库

安装​​zip​​库

go get -u go.uber.org/zap

测试

package main

import (
"go.uber.org/zap"
"net/http"
)

var(
logger *zap.Logger
)
func InitLogger(){
logger,_ = zap.NewProduction() //初始化
}
func TestLogger( url string ){
resp,err := http.Get( url )
if err != nil{
logger.Error("Error fetching url..",zap.String("url",url),zap.Error(err))
}else{
logger.Info("Success..",zap.String("statusCode",resp.Status ),zap.String("url",url))
}
}
func main(){
InitLogger()
defer logger.Sync()
TestLogger("h@://www.acwing.com")
TestLogger("http://www.acwing.com")
}

其中​​logger.Error​​的原型是

func (log *Logger) Error(msg string, fields ...Field)
//msg代表为必选的字段,后面的Field是可选字段,最后会把这些字段拼接成一个json输出

把日志写入文件

将日志写入文件而不是终端

  • 我们将使用​​zap.New(…)​​​方法来手动传递所有配置,而不是使用像​​zap.NewProduction()​​​这样的预置方法来创建​​logger​​。
func New(core zapcore.Core, options ...Option) *Logger

​zapcore.Core​​​需要三个配置——​​Encoder​​​,​​WriteSyncer​​​,​​LogLevel​​。

1.​​Encoder​​​:编码器(如何写入日志)。我们将使用开箱即用的​​NewJSONEncoder()​​​,并使用预先设置的​​ProductionEncoderConfig()​​。

zapcore.NewJSONEncoder(zap.NewProductionEncoderConfig())

2.​​WriterSyncer​​​:指定日志将写到哪里去。我们使用​​zapcore.AddSync()​​函数并且将打开的文件句柄传进去。

file, _ := os.Create("./test.log")
writeSyncer := zapcore.AddSync(file)

3.​​Log Level​​:设定哪种级别的日志将被写入。

于是,初始化​​logger​​就变成了这样

func InitLogger() {
writeSyncer := getLogWriter()
encoder := getEncoder()
core := zapcore.NewCore(encoder, writeSyncer, zapcore.DebugLevel)

logger = zap.New(core)
}

func getEncoder() zapcore.Encoder {
return zapcore.NewJSONEncoder(zap.NewProductionEncoderConfig())
}

func getLogWriter() zapcore.WriteSyncer {
file, _ := os.Create("./test.log")
return zapcore.AddSync(file)
}

最终版本

在​​getEncoder()​​中加入对时间格式的设置

​getLogWriter()​​​采用​​Lumberjack​​库支持(更多配置)

package main

import (
"net/http"

"github.com/natefinch/lumberjack"
"go.uber.org/zap"
"go.uber.org/zap/zapcore"
)

var sugarLogger *zap.SugaredLogger

func main() {
InitLogger()
defer sugarLogger.Sync()
simpleHttpGet("www.sogo.com")
simpleHttpGet("http://www.sogo.com")
}

func InitLogger() {
writeSyncer := getLogWriter()
encoder := getEncoder()
core := zapcore.NewCore(encoder, writeSyncer, zapcore.DebugLevel)

logger := zap.New(core, zap.AddCaller())
sugarLogger = logger.Sugar()
}

func getEncoder() zapcore.Encoder {
encoderConfig := zap.NewProductionEncoderConfig()
encoderConfig.EncodeTime = zapcore.ISO8601TimeEncoder
encoderConfig.EncodeLevel = zapcore.CapitalLevelEncoder
return zapcore.NewConsoleEncoder(encoderConfig)
}

func getLogWriter() zapcore.WriteSyncer {
lumberJackLogger := &lumberjack.Logger{
Filename: "./test.log",
MaxSize: 1,
MaxBackups: 5,
MaxAge: 30,
Compress: false,
}
return zapcore.AddSync(lumberJackLogger)
}

func simpleHttpGet(url string) {
sugarLogger.Debugf("Trying to hit GET request for %s", url)
resp, err := http.Get(url)
if err != nil {
sugarLogger.Errorf("Error fetching URL %s : Error = %s", url, err)
} else {
sugarLogger.Infof("Success! statusCode = %s for URL %s", resp.Status, url)
resp.Body.Close()
}
}