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),超過(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)文章希望大家以后多多支持腳本之家!
- golang?日志庫(kù)ZAP[uber-go?zap]示例詳解
- golang整合日志zap的實(shí)現(xiàn)示例
- Golang日志操作庫(kù)zap的使用詳解
- golang框架gin的日志處理和zap lumberjack日志使用方式
- GoLang基于zap日志庫(kù)的封裝過(guò)程詳解
- Golang定制化zap日志庫(kù)使用過(guò)程分析
- golang默認(rèn)Logger日志庫(kù)在項(xiàng)目中使用Zap日志庫(kù)
- golang有用的庫(kù)及工具 之 zap.Logger包的使用指南
- 深入淺析golang zap 日志庫(kù)使用(含文件切割、分級(jí)別存儲(chǔ)和全局使用等)
- golang zap日志庫(kù)的具體使用
相關(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
Go語(yǔ)言基礎(chǔ)switch條件語(yǔ)句基本用法及示例詳解
這篇文章主要為大家介紹了Go語(yǔ)言基礎(chǔ)switch條件語(yǔ)句基本用法及示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2021-11-11
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
Fedora14 Linux系統(tǒng)安裝Golang開(kāi)發(fā)環(huán)境筆記
這篇文章主要介紹了Fedora14 Linux系統(tǒng)安裝Golang開(kāi)發(fā)環(huán)境筆記,本文講解了2種安裝方法,需要的朋友可以參考下2014-10-10
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

