From bd94baa353498df2457b3d5aa192cc488b9fa0c6 Mon Sep 17 00:00:00 2001 From: Daniel Dao Date: Thu, 21 Jan 2016 12:44:25 +0000 Subject: [PATCH] add gelf option to customize compression type and level this allows user to choose the compression type (i.e. gzip/zlib/none) using --log-opt=gelf-compression-type=none or the compression level (-1..9) using --log-opt=gelf-compression-level=0 for gelf driver. Signed-off-by: Daniel Dao --- daemon/logger/gelf/gelf.go | 50 ++++++++++++++++++++++++++++++---- docs/admin/logging/overview.md | 10 +++++++ 2 files changed, 55 insertions(+), 5 deletions(-) diff --git a/daemon/logger/gelf/gelf.go b/daemon/logger/gelf/gelf.go index b42eb61b2c..3fe62c41b3 100644 --- a/daemon/logger/gelf/gelf.go +++ b/daemon/logger/gelf/gelf.go @@ -6,9 +6,12 @@ package gelf import ( "bytes" + "compress/flate" + "encoding/json" "fmt" "net" "net/url" + "strconv" "time" "github.com/Graylog2/go-gelf/gelf" @@ -24,7 +27,7 @@ type gelfLogger struct { writer *gelf.Writer ctx logger.Context hostname string - extra map[string]interface{} + rawExtra json.RawMessage } func init() { @@ -81,17 +84,43 @@ func New(ctx logger.Context) (logger.Logger, error) { extra[k] = v } + rawExtra, err := json.Marshal(extra) + if err != nil { + return nil, err + } + // create new gelfWriter gelfWriter, err := gelf.NewWriter(address) if err != nil { return nil, fmt.Errorf("gelf: cannot connect to GELF endpoint: %s %v", address, err) } + if v, ok := ctx.Config["gelf-compression-type"]; ok { + switch v { + case "gzip": + gelfWriter.CompressionType = gelf.CompressGzip + case "zlib": + gelfWriter.CompressionType = gelf.CompressZlib + case "none": + gelfWriter.CompressionType = gelf.CompressNone + default: + return nil, fmt.Errorf("gelf: invalid compression type %q", v) + } + } + + if v, ok := ctx.Config["gelf-compression-level"]; ok { + val, err := strconv.Atoi(v) + if err != nil { + return nil, fmt.Errorf("gelf: invalid compression level %s, err %v", v, err) + } + gelfWriter.CompressionLevel = val + } + return &gelfLogger{ writer: gelfWriter, ctx: ctx, hostname: hostname, - extra: extra, + rawExtra: rawExtra, }, nil } @@ -107,7 +136,7 @@ func (s *gelfLogger) Log(msg *logger.Message) error { Short: string(msg.Line), TimeUnix: float64(msg.Timestamp.UnixNano()/int64(time.Millisecond)) / 1000.0, Level: level, - Extra: s.extra, + RawExtra: s.rawExtra, } if err := s.writer.WriteMessage(&m); err != nil { @@ -127,15 +156,26 @@ func (s *gelfLogger) Name() string { // ValidateLogOpt looks for gelf specific log options gelf-address, & // gelf-tag. func ValidateLogOpt(cfg map[string]string) error { - for key := range cfg { + for key, val := range cfg { switch key { case "gelf-address": case "gelf-tag": case "tag": case "labels": case "env": + case "gelf-compression-level": + i, err := strconv.Atoi(val) + if err != nil || i < flate.DefaultCompression || i > flate.BestCompression { + return fmt.Errorf("unknown value %q for log opt %q for gelf log driver", val, key) + } + case "gelf-compression-type": + switch val { + case "gzip", "zlib", "none": + default: + return fmt.Errorf("unknown value %q for log opt %q for gelf log driver", val, key) + } default: - return fmt.Errorf("unknown log opt '%s' for gelf log driver", key) + return fmt.Errorf("unknown log opt %q for gelf log driver", key) } } diff --git a/docs/admin/logging/overview.md b/docs/admin/logging/overview.md index e3d3d11256..ea2ec1299f 100644 --- a/docs/admin/logging/overview.md +++ b/docs/admin/logging/overview.md @@ -146,6 +146,8 @@ The GELF logging driver supports the following options: --log-opt tag="database" --log-opt labels=label1,label2 --log-opt env=env1,env2 + --log-opt gelf-compression-type=gzip + --log-opt gelf-compression-level=1 The `gelf-address` option specifies the remote GELF server address that the driver connects to. Currently, only `udp` is supported as the transport and you must @@ -167,6 +169,14 @@ underscore (`_`). "_fizz": "buzz", // […] +The `gelf-compression-type` option can be used to change how the GELF driver +compresses each log message. The accepted values are `gzip`, `zlib` and `none`. +`gzip` is chosen by default. + +The `gelf-compression-level` option can be used to change the level of compresssion +when `gzip` or `zlib` is selected as `gelf-compression-type`. Accepted value +must be from from -1 to 9 (BestCompression). Higher levels typically +run slower but compress more. Default value is 1 (BestSpeed). ## fluentd options