update at 2023/08/14
This commit is contained in:
187
sshsvc/logmml/logmml.go
Normal file
187
sshsvc/logmml/logmml.go
Normal file
@@ -0,0 +1,187 @@
|
||||
// logger for omc/ems
|
||||
|
||||
package logmml
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"io"
|
||||
"log"
|
||||
)
|
||||
|
||||
// LogLevel defines a log level
|
||||
type LogLevel int
|
||||
|
||||
// enum all LogLevels
|
||||
const (
|
||||
// following level also match syslog.Priority value
|
||||
LOG_RET LogLevel = iota
|
||||
LOG_CMD
|
||||
LOG_OFF
|
||||
LOG_NODEF
|
||||
)
|
||||
|
||||
// default log options
|
||||
const (
|
||||
DEFAULT_LOG_PREFIX = "omc:mml"
|
||||
DEFAULT_LOG_FLAG = log.Ldate | log.Ltime | log.Lmsgprefix
|
||||
DEFAULT_LOG_LEVEL = LOG_CMD
|
||||
DEFAULT_CALL_DEPTH = 0
|
||||
)
|
||||
|
||||
// Logger is a logger interface
|
||||
type Logger interface {
|
||||
Ret(v ...interface{})
|
||||
Retf(format string, v ...interface{})
|
||||
Cmd(v ...interface{})
|
||||
Cmdf(format string, v ...interface{})
|
||||
|
||||
Level() LogLevel
|
||||
LevelString() string
|
||||
SetLevel(l LogLevel)
|
||||
}
|
||||
|
||||
var _ Logger = DiscardLogger{}
|
||||
|
||||
// DiscardLogger don't log implementation for ILogger
|
||||
type DiscardLogger struct{}
|
||||
|
||||
// Trace empty implementation
|
||||
func (DiscardLogger) Ret(v ...interface{}) {}
|
||||
|
||||
// Tracef empty implementation
|
||||
func (DiscardLogger) Retf(format string, v ...interface{}) {}
|
||||
|
||||
// Debug empty implementation
|
||||
func (DiscardLogger) Cmd(v ...interface{}) {}
|
||||
|
||||
// Debugf empty implementation
|
||||
func (DiscardLogger) Cmdf(format string, v ...interface{}) {}
|
||||
|
||||
// Level empty implementation
|
||||
func (DiscardLogger) Level() LogLevel {
|
||||
return LOG_NODEF
|
||||
}
|
||||
|
||||
// Level empty implementation
|
||||
func (DiscardLogger) LevelString() string {
|
||||
return ""
|
||||
}
|
||||
|
||||
// SetLevel empty implementation
|
||||
func (DiscardLogger) SetLevel(l LogLevel) {}
|
||||
|
||||
// EmsLogger is the default implment of ILogger
|
||||
type MMLLogger struct {
|
||||
RET *log.Logger
|
||||
CMD *log.Logger
|
||||
level LogLevel
|
||||
levelString []string
|
||||
//depth int
|
||||
}
|
||||
|
||||
var _ Logger = &MMLLogger{}
|
||||
|
||||
// NewEmsLogger2 let you customrize your logger prefix and flag
|
||||
func NewMmlLogger2(out io.Writer, prefix string, flag int) *MMLLogger {
|
||||
return NewMmlLogger3(out, prefix, flag, DEFAULT_LOG_LEVEL)
|
||||
}
|
||||
|
||||
// NewEmsLogger3 let you customrize your logger prefix and flag and logLevel
|
||||
func NewMmlLogger3(out io.Writer, prefix string, flag int, l LogLevel) *MMLLogger {
|
||||
return &MMLLogger{
|
||||
RET: log.New(out, fmt.Sprintf("[%s] [ret]: ", prefix), flag),
|
||||
CMD: log.New(out, fmt.Sprintf("[%s] [cmd]: ", prefix), flag),
|
||||
level: l,
|
||||
levelString: []string{"ret", "cmd"},
|
||||
//depth: DEFAULT_CALL_DEPTH,
|
||||
}
|
||||
}
|
||||
|
||||
// Trace implement ILogger
|
||||
func (s *MMLLogger) Ret(v ...interface{}) {
|
||||
if s.level <= LOG_RET {
|
||||
//_ = s.RET.Output(s.depth, fmt.Sprintln(v...))
|
||||
_ = s.RET.Output(0, fmt.Sprintln(v...))
|
||||
}
|
||||
}
|
||||
|
||||
// Tracef implement ILogger
|
||||
func (s *MMLLogger) Retf(format string, v ...interface{}) {
|
||||
if s.level <= LOG_RET {
|
||||
_ = s.RET.Output(0, fmt.Sprintf(format, v...))
|
||||
}
|
||||
}
|
||||
|
||||
// Debug implement ILogger
|
||||
func (s *MMLLogger) Cmd(v ...interface{}) {
|
||||
if s.level <= LOG_CMD {
|
||||
_ = s.CMD.Output(0, fmt.Sprintln(v...))
|
||||
}
|
||||
}
|
||||
|
||||
// Debugf implement ILogger
|
||||
func (s *MMLLogger) Cmdf(format string, v ...interface{}) {
|
||||
if s.level <= LOG_CMD {
|
||||
_ = s.CMD.Output(0, fmt.Sprintf(format, v...))
|
||||
}
|
||||
}
|
||||
|
||||
// Info implement ILogger
|
||||
|
||||
// Level implement ILogger
|
||||
func (s *MMLLogger) Level() LogLevel {
|
||||
return s.level
|
||||
}
|
||||
|
||||
// Level implement ILogger
|
||||
func (s *MMLLogger) LevelString() string {
|
||||
return s.levelString[s.level]
|
||||
}
|
||||
|
||||
// SetLevel implement ILogger
|
||||
func (s *MMLLogger) SetLevel(l LogLevel) {
|
||||
s.level = l
|
||||
}
|
||||
|
||||
var Elogger Logger
|
||||
|
||||
func InitMmlLogger(logFile string, period int, count int, prefix string, logLevel LogLevel) {
|
||||
logWriter := getLogWriter(logFile, period, count)
|
||||
Elogger = NewMmlLogger3(logWriter, prefix, DEFAULT_LOG_FLAG, logLevel)
|
||||
fmt.Printf("logFile=%s, period=%d, count=%d, prefix=%s, logLevel=%s\n", logFile, period, count, prefix, GetLevelString())
|
||||
}
|
||||
|
||||
// Trace implement ILogger
|
||||
func Ret(v ...interface{}) {
|
||||
Elogger.Ret(v...)
|
||||
}
|
||||
|
||||
// Tracef implement ILogger
|
||||
func Retf(format string, v ...interface{}) {
|
||||
Elogger.Retf(format, v...)
|
||||
}
|
||||
|
||||
// Debug implement ILogger
|
||||
func Cmd(v ...interface{}) {
|
||||
Elogger.Cmd(v...)
|
||||
}
|
||||
|
||||
// Debugf implement ILogger
|
||||
func Cmdf(format string, v ...interface{}) {
|
||||
Elogger.Cmdf(format, v...)
|
||||
}
|
||||
|
||||
// Level implement ILogger
|
||||
func GetLevel() LogLevel {
|
||||
return Elogger.Level()
|
||||
}
|
||||
|
||||
// Level implement ILogger
|
||||
func GetLevelString() string {
|
||||
return Elogger.LevelString()
|
||||
}
|
||||
|
||||
// SetLevel implement ILogger
|
||||
func SetLevel(l LogLevel) {
|
||||
Elogger.SetLevel(l)
|
||||
}
|
||||
71
sshsvc/logmml/partition.go
Normal file
71
sshsvc/logmml/partition.go
Normal file
@@ -0,0 +1,71 @@
|
||||
package logmml
|
||||
|
||||
import (
|
||||
"io"
|
||||
"time"
|
||||
|
||||
rotatelogs "github.com/lestrrat/go-file-rotatelogs"
|
||||
)
|
||||
|
||||
type WriteSyncer interface {
|
||||
io.Writer
|
||||
Sync() error
|
||||
}
|
||||
|
||||
// 得到LogWriter
|
||||
func getLogWriter(filePath string, period, count int) WriteSyncer {
|
||||
warnIoWriter := getWriter(filePath, period, count)
|
||||
return addSync(warnIoWriter)
|
||||
}
|
||||
|
||||
// 日志文件切割
|
||||
func getWriter(filename string, period, count int) io.Writer {
|
||||
// 保存日志count天,每period小时分割一次日志
|
||||
duration := time.Hour * time.Duration(period)
|
||||
var logfile string
|
||||
if period >= 24 {
|
||||
logfile = filename + "-%Y%m%d"
|
||||
} else {
|
||||
logfile = filename + "-%Y%m%d%H"
|
||||
}
|
||||
hook, err := rotatelogs.New(
|
||||
|
||||
logfile,
|
||||
rotatelogs.WithLinkName(filename),
|
||||
// rotatelogs.WithMaxAge(duration),
|
||||
rotatelogs.WithRotationCount(count),
|
||||
rotatelogs.WithRotationTime(duration),
|
||||
rotatelogs.WithLocation(time.Local),
|
||||
)
|
||||
|
||||
//保存日志30天,每1分钟分割一次日志
|
||||
/*
|
||||
hook, err := rotatelogs.New(
|
||||
filename+"_%Y%m%d%H%M.log",
|
||||
rotatelogs.WithLinkName(filename),
|
||||
rotatelogs.WithMaxAge(time.Hour*24*30),
|
||||
rotatelogs.WithRotationTime(time.Minute*1),
|
||||
)
|
||||
*/
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
return hook
|
||||
}
|
||||
|
||||
func addSync(w io.Writer) WriteSyncer {
|
||||
switch w := w.(type) {
|
||||
case WriteSyncer:
|
||||
return w
|
||||
default:
|
||||
return writerWrapper{w}
|
||||
}
|
||||
}
|
||||
|
||||
type writerWrapper struct {
|
||||
io.Writer
|
||||
}
|
||||
|
||||
func (w writerWrapper) Sync() error {
|
||||
return nil
|
||||
}
|
||||
Reference in New Issue
Block a user