package logging import ( "fmt" "io" "log" "os" ) func (l *FileLogger) Setup() { var err error l.Logger = log.Default() l.Logger.SetPrefix(l.Prefix) if l.writer, err = os.OpenFile(l.Path, appendFlags, logPerm); err != nil { log.Panicf("could not open log file \"%v\" for writing: %v\n", l.Path, err) } // https://stackoverflow.com/a/36719588/733214 multi := io.MultiWriter(os.Stdout, l.writer) l.Logger.SetOutput(multi) } func (l *FileLogger) Shutdown() { var err error if err = l.writer.Close(); err != nil { log.Panicf("could not close log file \"%v\": %v\n", l.Path, err) } } func (l *FileLogger) GetPrefix() string { return l.Prefix } func (l *FileLogger) DoDebug(d bool) { l.EnableDebug = d } func (l *FileLogger) SetPrefix(prefix string) { l.Prefix = prefix l.Logger.SetPrefix(prefix) } func (l *FileLogger) Alert(s string, v ...interface{}) (err error) { var msg string if v != nil { msg = fmt.Sprintf(s, v...) } else { msg = s } l.renderWrite(msg, "ALERT") return } func (l *FileLogger) Crit(s string, v ...interface{}) (err error) { var msg string if v != nil { msg = fmt.Sprintf(s, v...) } else { msg = s } l.renderWrite(msg, "CRITICAL") return } func (l *FileLogger) Debug(s string, v ...interface{}) (err error) { if !l.EnableDebug { return } var msg string if v != nil { msg = fmt.Sprintf(s, v...) } else { msg = s } l.renderWrite(msg, "DEBUG") return } func (l *FileLogger) Emerg(s string, v ...interface{}) (err error) { var msg string if v != nil { msg = fmt.Sprintf(s, v...) } else { msg = s } l.renderWrite(msg, "EMERGENCY") return } func (l *FileLogger) Err(s string, v ...interface{}) (err error) { var msg string if v != nil { msg = fmt.Sprintf(s, v...) } else { msg = s } l.renderWrite(msg, "ERROR") return } func (l *FileLogger) Info(s string, v ...interface{}) (err error) { var msg string if v != nil { msg = fmt.Sprintf(s, v...) } else { msg = s } l.renderWrite(msg, "INFO") return } func (l *FileLogger) Notice(s string, v ...interface{}) (err error) { var msg string if v != nil { msg = fmt.Sprintf(s, v...) } else { msg = s } l.renderWrite(msg, "NOTICE") return } func (l *FileLogger) Warning(s string, v ...interface{}) (err error) { var msg string if v != nil { msg = fmt.Sprintf(s, v...) } else { msg = s } l.renderWrite(msg, "WARNING") return } func (l *FileLogger) renderWrite(msg, prio string) { s := fmt.Sprintf("[%v] %v", prio, msg) l.Logger.Println(s) return }