package logging import ( "fmt" "log" "log/syslog" "os" ) type Logger struct { syslogWriter *syslog.Writer debugMode bool } var defaultLogger *Logger func init() { defaultLogger = NewLogger() } func NewLogger() *Logger { l := &Logger{ debugMode: os.Getenv("DEBUG") == "true", } // Try to connect to syslog if writer, err := syslog.New(syslog.LOG_INFO|syslog.LOG_DAEMON, "nannyagentv2"); err == nil { l.syslogWriter = writer } return l } func (l *Logger) Info(format string, args ...interface{}) { msg := fmt.Sprintf(format, args...) if l.syslogWriter != nil { l.syslogWriter.Info(msg) } log.Printf("[INFO] %s", msg) } func (l *Logger) Debug(format string, args ...interface{}) { if !l.debugMode { return } msg := fmt.Sprintf(format, args...) if l.syslogWriter != nil { l.syslogWriter.Debug(msg) } log.Printf("[DEBUG] %s", msg) } func (l *Logger) Warning(format string, args ...interface{}) { msg := fmt.Sprintf(format, args...) if l.syslogWriter != nil { l.syslogWriter.Warning(msg) } log.Printf("[WARNING] %s", msg) } func (l *Logger) Error(format string, args ...interface{}) { msg := fmt.Sprintf(format, args...) if l.syslogWriter != nil { l.syslogWriter.Err(msg) } log.Printf("[ERROR] %s", msg) } func (l *Logger) Close() { if l.syslogWriter != nil { l.syslogWriter.Close() } } // Global logging functions func Info(format string, args ...interface{}) { defaultLogger.Info(format, args...) } func Debug(format string, args ...interface{}) { defaultLogger.Debug(format, args...) } func Warning(format string, args ...interface{}) { defaultLogger.Warning(format, args...) } func Error(format string, args ...interface{}) { defaultLogger.Error(format, args...) }