package common import( "fmt" "log" "log/syslog" "io" ) type Logger struct { useSyslog bool verbosity int syslog *syslog.Writer stdlog *log.Logger } func NewLogger(prefix string, useSyslog bool, syslogFailOutput io.Writer, verbosity int) (*Logger, error) { out := Logger{ verbosity: verbosity, useSyslog: useSyslog} var err error out.stdlog = log.New(syslogFailOutput, prefix+" ", log.LstdFlags) if useSyslog { out.syslog, err = syslog.New(syslog.LOG_INFO, prefix) } return &out, err } func (l *Logger) Debug(m string, v ...interface{}) { var err error if l.verbosity < 2 { // -vv return } if l.useSyslog { err = l.syslog.Debug(l.buildString("", m, v...)) } if err != nil || !l.useSyslog { l.stdlog.Println(l.buildString("DEBUG", m, v...)) } } func (l *Logger) Info(m string, v ...interface{}) { var err error if l.verbosity < 1 { // -v return } if l.useSyslog { err = l.syslog.Info(l.buildString("", m, v...)) } if err != nil || !l.useSyslog { l.stdlog.Println(l.buildString(" INFO", m, v...)) } } func (l *Logger) Warn(m string, v ...interface{}) { var err error // Warnings are always shown if l.useSyslog { err = l.syslog.Warning(l.buildString("", m, v...)) } if err != nil || !l.useSyslog { l.stdlog.Println(l.buildString(" WARN", m, v...)) } } func (l *Logger) Error(m string, v ...interface{}) { var err error // Errors are always shown if l.useSyslog { err = l.syslog.Err(l.buildString("", m, v...)) } if err != nil || !l.useSyslog { l.stdlog.Println(l.buildString("ERROR", m, v...)) } } func (l *Logger) buildString(level, m string, v ...interface{}) string { out := m if level != "" { out = level + ":" + m } if len(v) > 0 { out = fmt.Sprintf(out, v...) } return out }