最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

使用Lumberjack+zap進(jìn)行日志切割歸檔操作

 更新時間:2020年12月16日 11:55:28   作者:線條君  
這篇文章主要介紹了使用Lumberjack+zap進(jìn)行日志切割歸檔操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧

使用Lumberjack+zap進(jìn)行日志切割歸檔

為了添加日志切割歸檔功能,我們將使用第三方庫Lumberjack來實現(xiàn)。

安裝

執(zhí)行下面的命令安裝Lumberjack

go get -u github.com/natefinch/lumberjack

zap logger中加入Lumberjack

要在zap中加入Lumberjack支持,我們需要修改WriteSyncer代碼。我們將按照下面的代碼修改getLogWriter()函數(shù):

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

Lumberjack Logger采用以下屬性作為輸入:

Filename: 日志文件的位置

MaxSize:在進(jìn)行切割之前,日志文件的最大大小(以MB為單位)

MaxBackups:保留舊文件的最大個數(shù)

MaxAges:保留舊文件的最大天數(shù)

Compress:是否壓縮/歸檔舊文件

測試所有功能

package main
import (
 "net/http"
 "go.uber.org/zap"
 "go.uber.org/zap/zapcore"
 lumberjack "gopkg.in/natefinch/lumberjack.v2"
)
var sugarLogger *zap.SugaredLogger
func main() {
 InitLogger()
 defer sugarLogger.Sync()
 for i:=0; i < 10000;i++ {
 simpleHttpGet("www.baidu.com")
 simpleHttpGet("http://www.baidu.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: "/aseit-data/gocode/src/gitlab.aseit.cn/AI_PRODUCT/psd_be_zhang/test/test.log", // ⽇志⽂件路徑
 MaxSize: 1,  // 1M=1024KB=1024000byte
 MaxBackups: 5,  // 最多保留5個備份
 MaxAge:  30,  // days
 Compress: false, // 是否壓縮 disabled by default
 }
 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()
 }
}

同時,可以在main函數(shù)中循環(huán)記錄日志,測試日志文件是否會自動切割和歸檔(日志文件每1MB會切割并且在當(dāng)前目錄下最多保存5個備份)。

補(bǔ)充:golang zap日志的使用

zap是一個高性能日志庫,github鏈接【傳送門】,下面簡單介紹一下zap的使用。

1.下載zap包

因為zap是uber開源的,zap內(nèi)使用的包是在go.uber.org/zap,如果直接go get這個包,可能會提示get不下來??梢詆o get github.com/uber-go/zap,然后再把zap目錄復(fù)制到src/go.uber.org下(可能還會需要go.uber.org/atomic和go.uber.org/multierr,均可參考該方法get下來)

2.zap簡單封裝示例。

package logger
 
import (
 "go.uber.org/zap"
 "go.uber.org/zap/zapcore"
 "gopkg.in/natefinch/lumberjack.v2"
)
 
// error logger
var errorLogger *zap.SugaredLogger
 
var levelMap = map[string]zapcore.Level{
 "debug": zapcore.DebugLevel,
 "info": zapcore.InfoLevel,
 "warn": zapcore.WarnLevel,
 "error": zapcore.ErrorLevel,
 "dpanic": zapcore.DPanicLevel,
 "panic": zapcore.PanicLevel,
 "fatal": zapcore.FatalLevel,
}
 
func getLoggerLevel(lvl string) zapcore.Level {
 if level, ok := levelMap[lvl]; ok {
 return level
 }
 return zapcore.InfoLevel
}
 
func init() {
 fileName := "zap.log"
 level := getLoggerLevel("debug")
 syncWriter := zapcore.AddSync(&lumberjack.Logger{
 Filename: fileName,
 MaxSize: 1 << 30, //1G
 LocalTime: true,
 Compress: true,
 })
 encoder := zap.NewProductionEncoderConfig()
 encoder.EncodeTime = zapcore.ISO8601TimeEncoder
 core := zapcore.NewCore(zapcore.NewJSONEncoder(encoder), syncWriter, zap.NewAtomicLevelAt(level))
 logger := zap.New(core, zap.AddCaller(), zap.AddCallerSkip(1))
 errorLogger = logger.Sugar()
}
 
func Debug(args ...interface{}) {
 errorLogger.Debug(args...)
}
 
func Debugf(template string, args ...interface{}) {
 errorLogger.Debugf(template, args...)
}
 
func Info(args ...interface{}) {
 errorLogger.Info(args...)
}
 
func Infof(template string, args ...interface{}) {
 errorLogger.Infof(template, args...)
}
 
func Warn(args ...interface{}) {
 errorLogger.Warn(args...)
}
 
func Warnf(template string, args ...interface{}) {
 errorLogger.Warnf(template, args...)
}
 
func Error(args ...interface{}) {
 errorLogger.Error(args...)
}
 
func Errorf(template string, args ...interface{}) {
 errorLogger.Errorf(template, args...)
}
 
func DPanic(args ...interface{}) {
 errorLogger.DPanic(args...)
}
 
func DPanicf(template string, args ...interface{}) {
 errorLogger.DPanicf(template, args...)
}
 
func Panic(args ...interface{}) {
 errorLogger.Panic(args...)
}
 
func Panicf(template string, args ...interface{}) {
 errorLogger.Panicf(template, args...)
}
 
func Fatal(args ...interface{}) {
 errorLogger.Fatal(args...)
}
 
func Fatalf(template string, args ...interface{}) {
 errorLogger.Fatalf(template, args...)
}

3.簡單封裝后使用示例:

package main
 
import (
 "logger"
)
 
func main() {
 logger.Infof("simple zap logger example") 
}

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。如有錯誤或未考慮完全的地方,望不吝賜教。

相關(guān)文章

  • Golang的Crypto/SHA256庫實戰(zhàn)指南

    Golang的Crypto/SHA256庫實戰(zhàn)指南

    無論是在保護(hù)數(shù)據(jù)安全、驗證數(shù)據(jù)完整性,還是在構(gòu)建復(fù)雜的安全系統(tǒng)中,crypto/sha256都是Golang程序員不可或缺的工具,本文主要介紹了Golang的Crypto/SHA256庫實戰(zhàn)指南,感興趣的可以了解一下
    2024-02-02
  • golang框架中跨服務(wù)的最佳通信協(xié)議和工具

    golang框架中跨服務(wù)的最佳通信協(xié)議和工具

    在 go 框架中實現(xiàn)跨服務(wù)通信的最佳實踐包括使用 grpc(適用于低延遲高吞吐量)、http 客戶端(適用于 restful api)和消息隊列(適用于異步解耦通信),在選擇通信方式時,應(yīng)考慮服務(wù)交互模式、性能要求和部署環(huán)境等因素
    2024-06-06
  • golang中的三個點(diǎn) ''...''的用法示例詳解

    golang中的三個點(diǎn) ''...''的用法示例詳解

    這篇文章主要介紹了golang中的三個點(diǎn) '...' 的用法示例詳解,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-11-11
  • 在Go中實現(xiàn)高效可靠的鏈路追蹤系統(tǒng)

    在Go中實現(xiàn)高效可靠的鏈路追蹤系統(tǒng)

    在當(dāng)今互聯(lián)網(wǎng)應(yīng)用的架構(gòu)中,分布式系統(tǒng)已經(jīng)成為主流,分布式系統(tǒng)的優(yōu)勢在于能夠提供高可用性、高并發(fā)性和可擴(kuò)展性,本文將介紹鏈路追蹤的概念和原理,并重點(diǎn)介紹如何在Golang中實現(xiàn)高效可靠的鏈路追蹤系統(tǒng),需要的朋友可以參考下
    2023-10-10
  • 使用golang編寫一個并發(fā)工作隊列

    使用golang編寫一個并發(fā)工作隊列

    這篇文章主要介紹了使用golang編寫一個并發(fā)工作隊列的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-05-05
  • Golang中的自定義函數(shù)詳解

    Golang中的自定義函數(shù)詳解

    函數(shù)構(gòu)成代碼執(zhí)行的邏輯結(jié)構(gòu)。在Go語言中,函數(shù)的基本組成為:關(guān)鍵字func、函數(shù)名、參數(shù)列表、返回值、函數(shù)體和返回語句。
    2018-10-10
  • 關(guān)于golang test緩存問題

    關(guān)于golang test緩存問題

    這篇文章主要介紹了關(guān)于golang test緩存問題,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-09-09
  • GO語言(golang)基礎(chǔ)知識

    GO語言(golang)基礎(chǔ)知識

    這篇文章主要介紹了GO語言(golang)基礎(chǔ)知識,需要的朋友可以參考下
    2015-01-01
  • Golang http包構(gòu)建RESTful API的實現(xiàn)

    Golang http包構(gòu)建RESTful API的實現(xiàn)

    在Go語言中實現(xiàn)RESTful API可以利用標(biāo)準(zhǔn)庫net/http提供的功能,它允許你輕松地創(chuàng)建和處理HTTP請求,本文主要介紹了Golang http包構(gòu)建RESTful API的實現(xiàn),感興趣的可以了解一下
    2024-01-01
  • Golang自動追蹤GitHub上熱門AI項目

    Golang自動追蹤GitHub上熱門AI項目

    這篇文章主要為大家介紹了Golang自動追蹤GitHub上熱門AI項目,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-12-12

最新評論

肃北| 昭通市| 临武县| 仙游县| 淮阳县| 商水县| 芒康县| 天等县| 永仁县| 荣昌县| 新化县| 微山县| 徐汇区| 辽阳县| 巴彦淖尔市| 富平县| 德格县| 汝南县| 嘉兴市| SHOW| 巴塘县| 平顶山市| 集安市| 广南县| 江陵县| 扎兰屯市| 乐东| 永州市| 西藏| 荆门市| 青河县| 炎陵县| 东城区| 平原县| 红原县| 东光县| 呈贡县| 尚义县| 长垣县| 白玉县| 额敏县|