From bf3a53f6d04d4f4e323a00a0ef2a63705e3601cc Mon Sep 17 00:00:00 2001 From: Ryan Uber Date: Wed, 21 May 2014 22:05:36 -0700 Subject: [PATCH] command/agent: added missing syslog wrapper --- command/agent/syslog.go | 49 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 command/agent/syslog.go diff --git a/command/agent/syslog.go b/command/agent/syslog.go new file mode 100644 index 0000000000..9f08385d8f --- /dev/null +++ b/command/agent/syslog.go @@ -0,0 +1,49 @@ +package agent + +import ( + "bytes" + "github.com/hashicorp/go-syslog" +) + +// levelPriority is used to map a log level to a +// syslog priority level +var levelPriority = map[string]gsyslog.Priority{ + "TRACE": gsyslog.LOG_DEBUG, + "DEBUG": gsyslog.LOG_INFO, + "INFO": gsyslog.LOG_NOTICE, + "WARN": gsyslog.LOG_WARNING, + "ERR": gsyslog.LOG_ERR, + "CRIT": gsyslog.LOG_CRIT, +} + +// SyslogWrapper is used to cleaup log messages before +// writing them to a Syslogger. Implements the io.Writer +// interface. +type SyslogWrapper struct { + l gsyslog.Syslogger +} + +// Write is used to implement io.Writer +func (s *SyslogWrapper) Write(p []byte) (int, error) { + // Extract log level + var level string + afterLevel := p + x := bytes.IndexByte(p, '[') + if x >= 0 { + y := bytes.IndexByte(p[x:], ']') + if y >= 0 { + level = string(p[x+1 : x+y]) + afterLevel = p[x+y+2:] + } + } + + // Each log level will be handled by a specific syslog priority + priority, ok := levelPriority[level] + if !ok { + priority = gsyslog.LOG_NOTICE + } + + // Attempt the write + err := s.l.WriteLevel(priority, afterLevel) + return len(p), err +}