update at 2023/08/14

This commit is contained in:
2023-08-14 21:41:37 +08:00
parent a039a664f1
commit 44e8cbee2c
255 changed files with 20426 additions and 233 deletions

187
sshsvc/logmml/logmml.go Normal file
View 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)
}

View 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
}