<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
// 建立pg資料庫連線 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 } // 連線池中最大連線數 engine.SetMaxOpenConns(100) // 連線池中最大空閒連線數 engine.SetMaxIdleConns(10) // 單個連線最大存活時間(單位:秒) engine.SetConnMaxLifetime(10) engine.ShowSQL(true) // 輸出紀錄檔 終點部分使用自定義紀錄檔記錄器 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),超過容量,檔案會自動分割 MaxBackups: 1, // 保留的紀錄檔天數(單位:天) MaxAge: 10, // 保留的紀錄檔檔案個數,檔案數量超過該值,最舊的檔案會被刪除 }) // 如果需要可以輸出當控制檯 //output = zapcore.NewMultiWriteSyncer(output, os.Stdout) level := zapcore.DebugLevel _ = level.Set("info") // 設定紀錄檔級別 debug info warn error fatal (紀錄檔級別從大到小) core := zapcore.NewCore( zapcore.NewJSONEncoder(zap.NewProductionEncoderConfig()), // 設定紀錄檔輸出格式 這塊可以自定義 output, zap.NewAtomicLevelAt(level), ) newLogger := zap.New(core, zap.AddStacktrace(zapcore.ErrorLevel)) loggerMap[loggerName] = newLogger loggerMu.Unlock() return newLogger } }
// 重點:實現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 }
// 測試 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{} ) // 建立pg資料庫連線 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 } // 連線池中最大連線數 engine.SetMaxOpenConns(100) // 連線池中最大空閒連線數 engine.SetMaxIdleConns(10) // 單個連線最大存活時間(單位:秒) engine.SetConnMaxLifetime(10) engine.ShowSQL(true) // 輸出紀錄檔 終點部分使用自定義紀錄檔記錄器 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),超過容量,檔案會自動分割 MaxBackups: 1, // 保留的紀錄檔天數(單位:天) MaxAge: 10, // 保留的紀錄檔檔案個數,檔案數量超過該值,最舊的檔案會被刪除 }) // 如果需要可以輸出當控制檯 //output = zapcore.NewMultiWriteSyncer(output, os.Stdout) level := zapcore.DebugLevel _ = level.Set("info") // 設定紀錄檔級別 debug info warn error fatal (紀錄檔級別從大到小) core := zapcore.NewCore( zapcore.NewJSONEncoder(zap.NewProductionEncoderConfig()), // 設定紀錄檔輸出格式 這塊可以自定義 output, zap.NewAtomicLevelAt(level), ) newLogger := zap.New(core, zap.AddStacktrace(zapcore.ErrorLevel)) loggerMap[loggerName] = newLogger loggerMu.Unlock() return newLogger } } // 重點:實現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() { // 測試 pgDb, err := newDb() fmt.Println(err) queryInterface, _ := pgDb.SQL("select * from test").QueryInterface() fmt.Println(queryInterface) }
Golang XORM搭配OpenTracing+Jaeger鏈路監控讓SQL執行一覽無遺(附原始碼)
到此這篇關於golang xorm 自定義紀錄檔記錄器,使用zap實現紀錄檔輸出、切割紀錄檔的文章就介紹到這了,更多相關golang zap紀錄檔內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45