Files
gorose-pro/logger.go
2021-09-26 11:56:27 +08:00

125 lines
2.4 KiB
Go

package gorose
import (
"fmt"
"time"
)
// LogLevel 日志级别
type LogLevel uint
const (
// LOG_SQL ...
LOG_SQL LogLevel = iota
// LOG_SLOW ...
LOG_SLOW
// LOG_ERROR ...
LOG_ERROR
)
// String ...
func (l LogLevel) String() string {
switch l {
case LOG_SQL:
return "SQL"
case LOG_SLOW:
return "SLOW"
case LOG_ERROR:
return "ERROR"
}
return ""
}
// LogOption ...
type LogOption struct {
FilePath string
EnableSqlLog bool
// 是否记录慢查询, 默认0s, 不记录, 设置记录的时间阀值, 比如 1, 则表示超过1s的都记录
EnableSlowLog float64
EnableErrorLog bool
}
// Logger ...
type Logger struct {
filePath string
sqlLog bool
slowLog float64
//infoLog bool
errLog bool
}
var _ ILogger = (*Logger)(nil)
//var onceLogger sync.Once
var logger *Logger
// NewLogger ...
func NewLogger(o *LogOption) *Logger {
//onceLogger.Do(func() {
logger = &Logger{filePath: "./"}
if o.FilePath != "" {
logger.filePath = o.FilePath
}
logger.sqlLog = o.EnableSqlLog
logger.slowLog = o.EnableSlowLog
logger.errLog = o.EnableErrorLog
//})
return logger
}
// DefaultLogger ...
func DefaultLogger() func(e *Engin) {
return func(e *Engin) {
e.logger = NewLogger(&LogOption{})
}
}
// EnableSqlLog ...
func (l *Logger) EnableSqlLog() bool {
return l.sqlLog
}
// EnableErrorLog ...
func (l *Logger) EnableErrorLog() bool {
return l.errLog
}
// EnableSlowLog ...
func (l *Logger) EnableSlowLog() float64 {
return l.slowLog
}
// Slow ...
func (l *Logger) Slow(sqlStr string, runtime time.Duration) {
if l.EnableSlowLog() > 0 && runtime.Seconds() > l.EnableSlowLog() {
logger.write(LOG_SLOW, "gorose_slow", sqlStr, runtime.String())
}
}
// Sql ...
func (l *Logger) Sql(sqlStr string, runtime time.Duration) {
if l.EnableSqlLog() {
logger.write(LOG_SQL, "gorose_sql", sqlStr, runtime.String())
}
}
// Error ...
func (l *Logger) Error(msg string) {
if l.EnableErrorLog() {
logger.write(LOG_ERROR, "gorose", msg, "0")
}
}
func (l *Logger) write(ll LogLevel, filename string, msg string, runtime string) {
now := time.Now()
date := now.Format("20060102")
datetime := now.Format("2006-01-02 15:04:05")
f := readFile(fmt.Sprintf("%s/%v_%v.log", l.filePath, date, filename))
content := fmt.Sprintf("[%v] [%v] %v --- %v\n", ll.String(), datetime, runtime, msg)
withLockContext(func() {
defer f.Close()
buf := []byte(content)
f.Write(buf)
})
}