Skip to content

Instantly share code, notes, and snippets.

@nenodias
Last active August 13, 2022 14:20
Show Gist options
  • Save nenodias/c5dd83edb6e0ca38776941f0bf441c39 to your computer and use it in GitHub Desktop.
Save nenodias/c5dd83edb6e0ca38776941f0bf441c39 to your computer and use it in GitHub Desktop.
Zerolog xorm

Xorm Engine can receive a Struct that implements the interface Logger from "xorm.io/xorm/log"

This example can be used for padronize the xorm logs with json format from zerlog.

type Logger interface {
	Debug(v ...interface{})
	Debugf(format string, v ...interface{})
	Error(v ...interface{})
	Errorf(format string, v ...interface{})
	Info(v ...interface{})
	Infof(format string, v ...interface{})
	Warn(v ...interface{})
	Warnf(format string, v ...interface{})

	Level() LogLevel
	SetLevel(l LogLevel)

	ShowSQL(show ...bool)
	IsShowSQL() bool
}
package database
import (
"fmt"
"github.com/rs/zerolog/log"
_ "github.com/lib/pq"
"github.com/nenodias/millenium/config"
"xorm.io/xorm"
)
var engine *xorm.Engine
func Init() {
var err error
username := "postgres"
password := "postgres"
host := "localhost"
port := "5432"
database := "database"
urlConnection := fmt.Sprintf("postgres://%s:%s@%s:%s/%s?sslmode=disable", username, password, host, port, database)
engine, err = xorm.NewEngine("postgres", urlConnection)
if err != nil {
log.Fatal().Stack().Err(err).Str("service", "database").Msgf("Cannot start connection with database")
}
engine.SetLogger(&CurrentLogger{logger: &log.Logger, showSQL: true})
}
func GetEngine() *xorm.Engine {
return engine
}
package database
import (
"github.com/rs/zerolog"
xlog "xorm.io/xorm/log"
)
type CurrentLogger struct {
logger *zerolog.Logger
showSQL bool
}
func (c *CurrentLogger) Debug(v ...interface{}) {
c.logger.Debug().Msgf("%v", v...)
}
func (c *CurrentLogger) Debugf(format string, v ...interface{}) {
c.logger.Debug().Msgf(format, v...)
}
func (c *CurrentLogger) Error(v ...interface{}) {
c.logger.Error().Msgf("%v", v...)
}
func (c *CurrentLogger) Errorf(format string, v ...interface{}) {
c.logger.Error().Msgf(format, v...)
}
func (c *CurrentLogger) Info(v ...interface{}) {
c.logger.Info().Msgf("%v", v...)
}
func (c *CurrentLogger) Infof(format string, v ...interface{}) {
c.logger.Info().Msgf(format, v...)
}
func (c *CurrentLogger) Warn(v ...interface{}) {
c.logger.Warn().Msgf("%v", v...)
}
func (c *CurrentLogger) Warnf(format string, v ...interface{}) {
c.logger.Warn().Msgf(format, v...)
}
func (c *CurrentLogger) Level() xlog.LogLevel {
level := c.logger.GetLevel()
switch level {
case zerolog.ErrorLevel:
return xlog.LOG_ERR
case zerolog.DebugLevel:
return xlog.LOG_DEBUG
case zerolog.FatalLevel:
return xlog.LOG_ERR
case zerolog.InfoLevel:
return xlog.LOG_INFO
case zerolog.NoLevel:
return xlog.LOG_OFF
case zerolog.WarnLevel:
return xlog.LOG_WARNING
default:
return xlog.LOG_UNKNOWN
}
}
func (c *CurrentLogger) SetLevel(l xlog.LogLevel) {
c.logger.Debug().Msgf("SetLevel called %v", l)
}
func (c *CurrentLogger) ShowSQL(show ...bool) {
c.showSQL = show[0]
}
func (c *CurrentLogger) IsShowSQL() bool {
return c.showSQL
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment