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

golang?xorm?自定義日志記錄器之使用zap實(shí)現(xiàn)日志輸出、切割日志(最新)

 更新時(shí)間:2022年10月26日 11:07:25   作者:一個(gè)搬磚的程序猿  
這篇文章主要介紹了golang?xorm?自定義日志記錄器,使用zap實(shí)現(xiàn)日志輸出、切割日志,包括連接postgresql數(shù)據(jù)庫(kù)的操作方法及?zap日志工具?,本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

1.準(zhǔn)備并下載好需要的包

  • xorm.io/xorm  
  • xorm.io/core
  • go.uber.org/zap
  • gopkg.in/natefinch/lumberjack.v2  用于切割zap
  • github.com/lib/pq  本文使用postgresql數(shù)據(jù)庫(kù)

2. 連接postgresql數(shù)據(jù)庫(kù)

// 創(chuàng)建pg數(shù)據(jù)庫(kù)連接
func newDb() (*xorm.Engine, error) {
	source := fmt.Sprintf("host=%s port=%d user=%s password=%s dbname=%s sslmode=disable",
		"127.0.0.1", 5432, "postgres", "root", "postgres")
 
	engine, err := xorm.NewEngine("postgres", source)
	if err != nil {
		return nil, err
	}
 
	// 連接池中最大連接數(shù)
	engine.SetMaxOpenConns(100)
	// 連接池中最大空閑連接數(shù)
	engine.SetMaxIdleConns(10)
	// 單個(gè)連接最大存活時(shí)間(單位:秒)
	engine.SetConnMaxLifetime(10)
	engine.ShowSQL(true)
 
	// 輸出日志 終點(diǎn)部分使用自定義日志記錄器
	engine.SetLogger(&customXormLogger{
		level:   xormlog.LOG_INFO,
		showSQL: true,
	})
 
	return engine, nil
}

3. zap日志工具

// zap
func getZapLog() *zap.Logger {
	loggerName := "db" // 日志文件名稱
 
	if logger, has := loggerMap[loggerName]; has {
		return logger
	} else {
		loggerMu.Lock()
 
		output := zapcore.AddSync(&lumberjack.Logger{
			Filename:   "./log",
			MaxSize:    100, // 日志文件最大容量(單位:MB),超過(guò)容量,文件會(huì)自動(dòng)分割
			MaxBackups: 1,   // 保留的日志天數(shù)(單位:天)
			MaxAge:     10,  // 保留的日志文件個(gè)數(shù),文件數(shù)量超過(guò)該值,最舊的文件會(huì)被刪除
		})
 
		// 如果需要可以輸出當(dāng)控制臺(tái)
		//output = zapcore.NewMultiWriteSyncer(output, os.Stdout)
		level := zapcore.DebugLevel
		_ = level.Set("info") // 設(shè)置日志級(jí)別  debug info warn error fatal (日志級(jí)別從大到小)
 
		core := zapcore.NewCore(
			zapcore.NewJSONEncoder(zap.NewProductionEncoderConfig()), // 設(shè)置日志輸出格式 這塊可以自定義
			output,
			zap.NewAtomicLevelAt(level),
		)
		newLogger := zap.New(core, zap.AddStacktrace(zapcore.ErrorLevel))
 
		loggerMap[loggerName] = newLogger
		loggerMu.Unlock()
		return newLogger
	}
}

4.實(shí)現(xiàn)xorm 自定義日志記錄器

// 重點(diǎn):實(shí)現(xiàn)xormLogger接口 自定義記錄器
type customXormLogger struct {
	level   xormlog.LogLevel
	showSQL bool
}
 
var _ xormlog.Logger = &customXormLogger{}
 
func (c *customXormLogger) Debug(v ...interface{}) {
	if c.level <= xormlog.LOG_DEBUG {
		fmt.Println(v...)
	}
	return
}
 
func (c *customXormLogger) Debugf(format string, v ...interface{}) {
	if c.level <= xormlog.LOG_DEBUG {
		getZapLog().Debug(fmt.Sprint(v...))
	}
	return
}
 
func (c *customXormLogger) Error(v ...interface{}) {
	if c.level <= xormlog.LOG_ERR {
		fmt.Println(v...)
	}
	return
}
 
func (c *customXormLogger) Errorf(format string, v ...interface{}) {
	if c.level <= xormlog.LOG_ERR {
		getZapLog().Error(fmt.Sprint(v...))
	}
	return
}
 
func (c *customXormLogger) Info(v ...interface{}) {
	if c.level <= xormlog.LOG_INFO {
		fmt.Println(v...)
	}
	return
}
 
func (c *customXormLogger) Infof(format string, v ...interface{}) {
	if c.level <= xormlog.LOG_INFO {
		getZapLog().Info(fmt.Sprint(v...))
	}
	return
}
 
func (c *customXormLogger) Warn(v ...interface{}) {
	if c.level <= xormlog.LOG_WARNING {
		fmt.Println(v...)
	}
	return
}
 
func (c *customXormLogger) Warnf(format string, v ...interface{}) {
	if c.level <= xormlog.LOG_WARNING {
		getZapLog().Warn(fmt.Sprint(v...))
	}
	return
}
 
func (c *customXormLogger) Level() xormlog.LogLevel {
	return c.level
}
 
func (c *customXormLogger) SetLevel(l xormlog.LogLevel) {
	c.level = l
	return
}
 
func (c *customXormLogger) ShowSQL(show ...bool) {
	if len(show) == 0 {
		c.showSQL = true
		return
	}
	c.showSQL = show[0]
}
 
func (c *customXormLogger) IsShowSQL() bool {
	return c.showSQL
}

5.使用

// 測(cè)試
	pgDb, err := newDb()
	fmt.Println(err)
 
	queryInterface, _ := pgDb.SQL("select * from test").QueryInterface()
 
	fmt.Println(queryInterface)

完整代碼

package main
 
import (
	"fmt"
	_ "github.com/lib/pq"
	"go.uber.org/zap"
	"go.uber.org/zap/zapcore"
	"gopkg.in/natefinch/lumberjack.v2"
	"sync"
	"xorm.io/xorm"
	xormlog "xorm.io/xorm/log"
)
 
var (
	loggerMap = map[string]*zap.Logger{}
	loggerMu  = &sync.Mutex{}
)
 
// 創(chuàng)建pg數(shù)據(jù)庫(kù)連接
func newDb() (*xorm.Engine, error) {
	source := fmt.Sprintf("host=%s port=%d user=%s password=%s dbname=%s sslmode=disable",
		"127.0.0.1", 5432, "postgres", "root", "postgres")
 
	engine, err := xorm.NewEngine("postgres", source)
	if err != nil {
		return nil, err
	}
 
	// 連接池中最大連接數(shù)
	engine.SetMaxOpenConns(100)
	// 連接池中最大空閑連接數(shù)
	engine.SetMaxIdleConns(10)
	// 單個(gè)連接最大存活時(shí)間(單位:秒)
	engine.SetConnMaxLifetime(10)
	engine.ShowSQL(true)
 
	// 輸出日志 終點(diǎn)部分使用自定義日志記錄器
	engine.SetLogger(&customXormLogger{
		level:   xormlog.LOG_INFO,
		showSQL: true,
	})
 
	return engine, nil
}
 
// zap
func getZapLog() *zap.Logger {
	loggerName := "db" // 日志文件名稱
 
	if logger, has := loggerMap[loggerName]; has {
		return logger
	} else {
		loggerMu.Lock()
 
		output := zapcore.AddSync(&lumberjack.Logger{
			Filename:   "./log",
			MaxSize:    100, // 日志文件最大容量(單位:MB),超過(guò)容量,文件會(huì)自動(dòng)分割
			MaxBackups: 1,   // 保留的日志天數(shù)(單位:天)
			MaxAge:     10,  // 保留的日志文件個(gè)數(shù),文件數(shù)量超過(guò)該值,最舊的文件會(huì)被刪除
		})
 
		// 如果需要可以輸出當(dāng)控制臺(tái)
		//output = zapcore.NewMultiWriteSyncer(output, os.Stdout)
		level := zapcore.DebugLevel
		_ = level.Set("info") // 設(shè)置日志級(jí)別  debug info warn error fatal (日志級(jí)別從大到小)
 
		core := zapcore.NewCore(
			zapcore.NewJSONEncoder(zap.NewProductionEncoderConfig()), // 設(shè)置日志輸出格式 這塊可以自定義
			output,
			zap.NewAtomicLevelAt(level),
		)
		newLogger := zap.New(core, zap.AddStacktrace(zapcore.ErrorLevel))
 
		loggerMap[loggerName] = newLogger
		loggerMu.Unlock()
		return newLogger
	}
}
 
// 重點(diǎn):實(shí)現(xiàn)xormLogger接口 自定義記錄器
type customXormLogger struct {
	level   xormlog.LogLevel
	showSQL bool
}
 
var _ xormlog.Logger = &customXormLogger{}
 
func (c *customXormLogger) Debug(v ...interface{}) {
	if c.level <= xormlog.LOG_DEBUG {
		fmt.Println(v...)
	}
	return
}
 
func (c *customXormLogger) Debugf(format string, v ...interface{}) {
	if c.level <= xormlog.LOG_DEBUG {
		getZapLog().Debug(fmt.Sprint(v...))
	}
	return
}
 
func (c *customXormLogger) Error(v ...interface{}) {
	if c.level <= xormlog.LOG_ERR {
		fmt.Println(v...)
	}
	return
}
 
func (c *customXormLogger) Errorf(format string, v ...interface{}) {
	if c.level <= xormlog.LOG_ERR {
		getZapLog().Error(fmt.Sprint(v...))
	}
	return
}
 
func (c *customXormLogger) Info(v ...interface{}) {
	if c.level <= xormlog.LOG_INFO {
		fmt.Println(v...)
	}
	return
}
 
func (c *customXormLogger) Infof(format string, v ...interface{}) {
	if c.level <= xormlog.LOG_INFO {
		getZapLog().Info(fmt.Sprint(v...))
	}
	return
}
 
func (c *customXormLogger) Warn(v ...interface{}) {
	if c.level <= xormlog.LOG_WARNING {
		fmt.Println(v...)
	}
	return
}
 
func (c *customXormLogger) Warnf(format string, v ...interface{}) {
	if c.level <= xormlog.LOG_WARNING {
		getZapLog().Warn(fmt.Sprint(v...))
	}
	return
}
 
func (c *customXormLogger) Level() xormlog.LogLevel {
	return c.level
}
 
func (c *customXormLogger) SetLevel(l xormlog.LogLevel) {
	c.level = l
	return
}
 
func (c *customXormLogger) ShowSQL(show ...bool) {
	if len(show) == 0 {
		c.showSQL = true
		return
	}
	c.showSQL = show[0]
}
 
func (c *customXormLogger) IsShowSQL() bool {
	return c.showSQL
}
 
func main() {
	// 測(cè)試
	pgDb, err := newDb()
	fmt.Println(err)
 
	queryInterface, _ := pgDb.SQL("select * from test").QueryInterface()
 
	fmt.Println(queryInterface)
}

參考文檔

Golang XORM搭配OpenTracing+Jaeger鏈路監(jiān)控讓SQL執(zhí)行一覽無(wú)遺(附源碼)

到此這篇關(guān)于golang xorm 自定義日志記錄器,使用zap實(shí)現(xiàn)日志輸出、切割日志的文章就介紹到這了,更多相關(guān)golang  zap日志內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Go標(biāo)準(zhǔn)庫(kù)http?server的優(yōu)雅關(guān)閉深入理解

    Go標(biāo)準(zhǔn)庫(kù)http?server的優(yōu)雅關(guān)閉深入理解

    這篇文章主要為大家介紹了Go標(biāo)準(zhǔn)庫(kù)http?server的優(yōu)雅有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪關(guān)閉深入理解
    2024-01-01
  • golang 實(shí)現(xiàn)并發(fā)求和

    golang 實(shí)現(xiàn)并發(fā)求和

    這篇文章主要介紹了golang 并發(fā)求和的實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-05-05
  • Go語(yǔ)言基礎(chǔ)switch條件語(yǔ)句基本用法及示例詳解

    Go語(yǔ)言基礎(chǔ)switch條件語(yǔ)句基本用法及示例詳解

    這篇文章主要為大家介紹了Go語(yǔ)言基礎(chǔ)switch條件語(yǔ)句基本用法及示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步
    2021-11-11
  • go NewTicker的用法示例代碼

    go NewTicker的用法示例代碼

    在 Go 語(yǔ)言中,time.NewTicker函數(shù)用于創(chuàng)建一個(gè)周期性觸發(fā)的定時(shí)器,這篇文章主要介紹了go NewTicker的使用,需要的朋友可以參考下
    2023-07-07
  • Go處理JSON數(shù)據(jù)的實(shí)現(xiàn)

    Go處理JSON數(shù)據(jù)的實(shí)現(xiàn)

    本文主要介紹了Go處理JSON數(shù)據(jù)的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-02-02
  • go mod init 和go mod tidy命令的使用

    go mod init 和go mod tidy命令的使用

    本文主要介紹了go mod init 和go mod tidy命令的使用,兩者是Go項(xiàng)目依賴管理的關(guān)鍵步驟,下面就來(lái)介紹一下如何使用,感興趣的可以了解一下
    2025-06-06
  • Golang使用Consul詳解

    Golang使用Consul詳解

    Consul是一個(gè)服務(wù)發(fā)現(xiàn)軟件, 提供了服務(wù)發(fā)現(xiàn)\鍵值存儲(chǔ)\健康檢查等功能,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06
  • Fedora14 Linux系統(tǒng)安裝Golang開發(fā)環(huán)境筆記

    Fedora14 Linux系統(tǒng)安裝Golang開發(fā)環(huán)境筆記

    這篇文章主要介紹了Fedora14 Linux系統(tǒng)安裝Golang開發(fā)環(huán)境筆記,本文講解了2種安裝方法,需要的朋友可以參考下
    2014-10-10
  • golang之log rotate詳解

    golang之log rotate詳解

    下面小編就為大家?guī)?lái)一篇golang之log rotate詳解。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-06-06
  • GoLang語(yǔ)法之標(biāo)準(zhǔn)庫(kù)fmt.Printf的使用

    GoLang語(yǔ)法之標(biāo)準(zhǔn)庫(kù)fmt.Printf的使用

    fmt包實(shí)現(xiàn)了類似C語(yǔ)言printf和scanf的格式化I/O,主要分為向外輸出內(nèi)容和獲取輸入內(nèi)容兩大部分,本文就來(lái)介紹一下GoLang語(yǔ)法之標(biāo)準(zhǔn)庫(kù)fmt.Printf的使用,感興趣的可以了解下
    2023-10-10

最新評(píng)論

广汉市| 红桥区| 泗阳县| 察雅县| 宁波市| 夏河县| 五莲县| 汾阳市| 江永县| 弋阳县| 博罗县| 独山县| 金华市| 丘北县| 虹口区| 股票| 朔州市| 噶尔县| 永和县| 安宁市| 平凉市| 金平| 土默特右旗| 宁安市| 龙江县| 若尔盖县| 独山县| 青阳县| 通江县| 财经| 松江区| 绵阳市| 肃北| 黑山县| 平邑县| 太白县| 和龙市| 冕宁县| 临夏县| 肇州县| 沭阳县|