...

Source file src/github.com/rs/zerolog/syslog.go

Documentation: github.com/rs/zerolog

     1  // +build !windows
     2  // +build !binary_log
     3  
     4  package zerolog
     5  
     6  import (
     7  	"io"
     8  )
     9  
    10  // See http://cee.mitre.org/language/1.0-beta1/clt.html#syslog
    11  // or https://www.rsyslog.com/json-elasticsearch/
    12  const ceePrefix = "@cee:"
    13  
    14  // SyslogWriter is an interface matching a syslog.Writer struct.
    15  type SyslogWriter interface {
    16  	io.Writer
    17  	Debug(m string) error
    18  	Info(m string) error
    19  	Warning(m string) error
    20  	Err(m string) error
    21  	Emerg(m string) error
    22  	Crit(m string) error
    23  }
    24  
    25  type syslogWriter struct {
    26  	w      SyslogWriter
    27  	prefix string
    28  }
    29  
    30  // SyslogLevelWriter wraps a SyslogWriter and call the right syslog level
    31  // method matching the zerolog level.
    32  func SyslogLevelWriter(w SyslogWriter) LevelWriter {
    33  	return syslogWriter{w, ""}
    34  }
    35  
    36  // SyslogCEEWriter wraps a SyslogWriter with a SyslogLevelWriter that adds a
    37  // MITRE CEE prefix for JSON syslog entries, compatible with rsyslog 
    38  // and syslog-ng JSON logging support. 
    39  // See https://www.rsyslog.com/json-elasticsearch/
    40  func SyslogCEEWriter(w SyslogWriter) LevelWriter {
    41  	return syslogWriter{w, ceePrefix}
    42  }
    43  
    44  func (sw syslogWriter) Write(p []byte) (n int, err error) {
    45  	var pn int
    46  	if sw.prefix != "" {
    47  		pn, err = sw.w.Write([]byte(sw.prefix))
    48  		if err != nil {
    49  			return pn, err
    50  		}
    51  	}
    52  	n, err = sw.w.Write(p)
    53  	return pn + n, err
    54  }
    55  
    56  // WriteLevel implements LevelWriter interface.
    57  func (sw syslogWriter) WriteLevel(level Level, p []byte) (n int, err error) {
    58  	switch level {
    59  	case TraceLevel:
    60  	case DebugLevel:
    61  		err = sw.w.Debug(sw.prefix + string(p))
    62  	case InfoLevel:
    63  		err = sw.w.Info(sw.prefix + string(p))
    64  	case WarnLevel:
    65  		err = sw.w.Warning(sw.prefix + string(p))
    66  	case ErrorLevel:
    67  		err = sw.w.Err(sw.prefix + string(p))
    68  	case FatalLevel:
    69  		err = sw.w.Emerg(sw.prefix + string(p))
    70  	case PanicLevel:
    71  		err = sw.w.Crit(sw.prefix + string(p))
    72  	case NoLevel:
    73  		err = sw.w.Info(sw.prefix + string(p))
    74  	default:
    75  		panic("invalid level")
    76  	}
    77  	// Any CEE prefix is not part of the message, so we don't include its length
    78  	n = len(p)
    79  	return
    80  }
    81  

View as plain text