package slog import ( "fmt" "io" "path/filepath" "runtime" "time" ) type SLogFormatFct func(level SLogLevel, verbose bool, timeformat string, format string, a ...interface{}) string func defaultSLogFormatFct(level SLogLevel, verbose bool, timeformat string, format string, a ...interface{}) string { msg := fmt.Sprintf("%s - ", SLogLevelToString(level)) if timeformat != "" { t := time.Now() msg = fmt.Sprintf("%s - %s", t.Format(timeformat), msg) } if verbose { if fct, file, line, ok := runtime.Caller(3); ok { msg = msg + fmt.Sprintf("{File: %s, Line: %d, Function: %s} - ", filepath.Base(file), line, runtime.FuncForPC(fct).Name()) } } msg = fmt.Sprintf(msg+format, a...) return msg } type SLogLevel int const ( ERROR SLogLevel = iota WARN INFO DEBUG ) func GetSLogLevel(level string) SLogLevel { switch level { case "ERROR": return ERROR case "WARN": return WARN case "INFO": return INFO case "DEBUG": return DEBUG default: return ERROR } } func SLogLevelToString(level SLogLevel) string { switch level { case ERROR: return "ERROR" case WARN: return "WARN" case INFO: return "INFO" case DEBUG: return "DEBUG" default: return "ERROR" } } type SLogger struct { level SLogLevel verbose bool formatfct SLogFormatFct timeformat string loggers []io.Writer } func NewSLogger() (ret *SLogger) { ret = &SLogger{} ret.level = ERROR ret.verbose = false ret.timeformat = "2006-01-02 15:04:05 MST" ret.formatfct = defaultSLogFormatFct ret.loggers = []io.Writer{NewStdoutLogger()} return ret } var defaultSLog = NewSLogger() func (sl *SLogger) log(level SLogLevel, format string, a ...interface{}) { if level > sl.level { return } msg := sl.formatfct(level, sl.verbose, sl.timeformat, format, a...) for _, l := range sl.loggers { l.Write([]byte(msg)) } } func LOG_ERROR(format string, a ...interface{}) { defaultSLog.log(ERROR, format, a...) } func LOG_WARN(format string, a ...interface{}) { defaultSLog.log(WARN, format, a...) } func LOG_INFO(format string, a ...interface{}) { defaultSLog.log(INFO, format, a...) } func LOG_DEBUG(format string, a ...interface{}) { defaultSLog.log(DEBUG, format, a...) } func SET_LEVEL(level SLogLevel) { defaultSLog.SetLevel(level) } func SET_FORMAT(fct SLogFormatFct) { defaultSLog.SetFormat(fct) } func SET_VERBOSE(verbose bool) { defaultSLog.SetVerbose(verbose) } func SET_TIMEFORMAT(timeformat string) { defaultSLog.SetTimeFormat(timeformat) } func ADD_LOGGER(logger io.Writer) { defaultSLog.AddLogger(logger) } func SET_LOGGERS(loggers []io.Writer) { defaultSLog.SetLoggers(loggers) } func CLEAR_LOGGERS() { defaultSLog.ClearLoggers() } func (sl *SLogger) SetLevel(level SLogLevel) { sl.level = level } func (sl *SLogger) SetVerbose(verbose bool) { sl.verbose = verbose } func (sl *SLogger) SetFormat(fct SLogFormatFct) { sl.formatfct = fct } func (sl *SLogger) SetTimeFormat(format string) { sl.timeformat = format } func (sl *SLogger) AddLogger(logger io.Writer) { sl.loggers = append(sl.loggers, logger) } func (sl *SLogger) SetLoggers(loggers []io.Writer) { sl.loggers = loggers } func (sl *SLogger) ClearLoggers() { sl.loggers = []io.Writer{} }