golang?xorm?自定義日志記錄器之使用zap實(shí)現(xiàn)日志輸出、切割日志(最新)
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),超過容量,文件會(huì)自動(dòng)分割
MaxBackups: 1, // 保留的日志天數(shù)(單位:天)
MaxAge: 10, // 保留的日志文件個(gè)數(shù),文件數(shù)量超過該值,最舊的文件會(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),超過容量,文件會(huì)自動(dòng)分割
MaxBackups: 1, // 保留的日志天數(shù)(單位:天)
MaxAge: 10, // 保留的日志文件個(gè)數(shù),文件數(shù)量超過該值,最舊的文件會(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)文章
在 Golang 中實(shí)現(xiàn)一個(gè)簡(jiǎn)單的Http中間件過程詳解
本文在go web中簡(jiǎn)單的實(shí)現(xiàn)了中間件的機(jī)制,這樣帶來的好處也是顯而易見的,當(dāng)然社區(qū)也有一些成熟的 middleware 組件,包括 Gin 一些Web框架中也包含了 middleware 相關(guān)的功能,具體內(nèi)容詳情跟隨小編一起看看吧2021-07-07
Go語(yǔ)言實(shí)現(xiàn)類似c++中的多態(tài)功能實(shí)例
Go本身不具有多態(tài)的特性,不能夠像Java、C++那樣編寫多態(tài)類、多態(tài)方法。但是,使用Go可以編寫具有多態(tài)功能的類綁定的方法。下面來一起看看吧2016-09-09
Golang分布式鎖簡(jiǎn)單案例實(shí)現(xiàn)流程
分布式鎖是控制分布式系統(tǒng)之間同步訪問共享資源的一種方式。如果不同的系統(tǒng)或是同一個(gè)系統(tǒng)的不同主機(jī)之間共享了一個(gè)或一組資源,那么訪問這些資源時(shí),需要通過一些互斥手段來防止彼此之間的干擾以保證一致性,在這種情況下,就需要使用分布式鎖了2022-12-12
Go-RESTful實(shí)現(xiàn)下載功能思路詳解
這篇文章主要介紹了Go-RESTful實(shí)現(xiàn)下載功能,文件下載包括文件系統(tǒng)IO和網(wǎng)絡(luò)IO,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-10-10
Go標(biāo)準(zhǔn)庫(kù)Flag庫(kù)和Log庫(kù)的使用
本文主要介紹了Go標(biāo)準(zhǔn)庫(kù)Flag庫(kù)和Log庫(kù)的使用,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-05-05

