redis

package module
v0.0.0-...-20c958b Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Dec 31, 2020 License: Apache-2.0 Imports: 10 Imported by: 0

README

logspout-redis-logstash

Logspout adapter for writing Docker container stdout/stderr logs to Redis in Logstash jsonevent layout.

Since v0.1.4 JSON input is supported, enabling you to add structure to your logs.

Docker image available

Logspout including this adapter is available on Docker Hub. Pull it with:

$ docker pull rtoma/logspout-redis-logstash

How to use the Docker image

$ docker run -d --name logspout \
  -v /var/run/docker.sock:/var/run/docker.sock:ro \
  rtoma/logspout-redis-logstash \
  redis://<your-redis-server>?key=bla&...

Configuration

Some configuration can be passed via container environment keys.

Some can be passed via route options (e.g. logspout redis://<host>?key=foo&password=secret).

This table shows all configuration parameters:

Parameter Default Environment key Route option key
Enable debug, if set debug logging will be printed disabled DEBUG debug
Redis password, if set this will force the adapter to execute a Redis AUTH command none REDIS_PASSWORD password
Redis key, events will be pushed to this Redis list object 'logspout' REDIS_KEY key
Redis database, if set the adapter will execute a Redis SELECT command 0 REDIS_DATABASE database
Docker host, will add a docker.host=<host> field to the event, allowing you to add the hostname of your host, identifying where your container was running (think mesos) none REDIS_DOCKER_HOST docker_host
Use Layout v0, what Logstash json format is used. With v0 JSON input support is disabled. false (meaning we use v1) REDIS_USE_V0_LAYOUT use_v0_layout
Logstash type, if set the event will get a @type property none REDIS_LOGSTASH_TYPE logstash_type
If true, will replace all "." in container labels with "_". You need to set this if you are using Elasticsearch 2.x false DEDOT_LABELS dedot_labels
Mute errors (to avoid error storm), disable by setting to other than 'true' true MUTE_ERRORS mute_errors
Redis connection timeout 100 ms CONNECT_TIMEOUT connect_timeout
Redis read timeout 300 ms READ_TIMEOUT read_timeout
Redis write timeout 500 ms WRITE_TIMEOUT write_timeout

Note on timeouts: Logspout stops tailing a container log if an adapter (like this one) takes longer than 1.0 second to process an event. That's why the sum of our default timeouts is a safe 900 ms.

JSON input support

Note: this does not work when using the Logstash v0 layout.

Since v0.1.4 JSON input is supported, enabling you to add structure to your logs. Big words, but this is what it does.

Imagine your docker application to emit a log to stdout like:

{"message":"I was very busy","items_processed":42,"elapsed_time_ms":123}

Logspout-redis-logstash will recognize this log as a JSON string and will embed the fields into the JSON document. This is how the final JSON document looks like that will be send to Redis:

{
  "@timestamp": "2016-03-30T09:54:24.587277635Z",
  "host": "ef5fe78b6a8e",
  "message": "I was very busy",
  "docker": { ... },
  "event": {
    "elapsed_time_ms": 123,
    "items_processed": 42
  }
}

What just happened?

  • the message field is set with the value from our input document.
  • the document contains a event hash filled with all input fields (ex message)
Logtypes

Using the logtype field in the input JSON doc, allows you to control the name of the field hash. This was added to give you some control over different logtypes you may want to implement.

Usecase: imagine you have an application that handles HTTP requests and wants to emit acceslog and applicationlog events. These events are different and you want to handle them differently.

We currently support two types:

  • accesslog
  • applog

Example input JSON to illustrate this "data wrangling" feature:

{"logtype":"applog","message":"something went bOOm!","level":"ERROR","line":42,"file":"source.go"}

Which results in this JSON doc for Redis:

{
  "@timestamp": "2016-03-30T10:03:00.016733514Z",
  "host": "16cecd099d78",
  "message": "something went bOOm!",
  "docker": { ... },
  "logtype": "applog",
  "applog": {
    "file": "source.go",
    "level": "ERROR",
    "line": 42
  }
}

See what happened?

  • the logtype field is added and is set with the value from our input doc.
  • the event hash is now called applog, because of the logtype

If you'd used "logtype":"accesslog" the JSON doc would have looked like:

{
  ... ,
  "logtype": "accesslog",
  "accesslog": {
    "file": "source.go",
    "level": "ERROR",
    "line": 42
  }
}

Building

Use ./build.sh <version> to build a Docker image for a tagged version. If you developing, use ./build.sh -d <version> to build a Docker image from local sources.

To build a newer version from remote branch master with a specific logspout and golang version, you can run ./build.sh -g golang:1.8 master v3.2.4.

Contribution

Want to add features? Feel welcome to submit a pull request!

If you are unable to code, feel free to create a issue describing your feature request or bug report.

Changelog

0.1.8, 0.1.9 and 0.1.10
  • Improved build system
0.1.7
  • Added parameter for dedotting Docker labels (required for ES 2.x). Thanks to adepretis!
0.1.6
  • Added parameters for Redis connection timeouts
  • Error muting can now be disabled for troubleshooting
  • Added tracing id in error messages
  • Logging of successful rpush after error
0.1.5
  • Added support for Docker labels. Thanks to teemupo!
0.1.4
  • Added support for JSON input. See the paragraph for more information. Thanks to dickiedick62!
0.1.3
  • Refactoring of configuration possiblities
  • Introducing the 'Redis database' configuration parameter, allowing you to push events to a specific Redis database number.
0.1.2
  • Bugfix: edge case when using a non-Hub image with port number (e.g. my.registry.com:443/my/image:tag)
  • Added unit tests to test for regression
0.1.1
  • The Redis adapter will now reconnect if Redis is unavailable or returns an error. Only 1 reconnect is attempted per event, so if it fails the event gets dropped. Thanks to @rogierlommers
  • You can now specify a @type field value. Only if specified this field will be added to the event document. Thanks to @dkhunt27
0.1.0
  • initial version

ELK integration

Try out logspout with redis-logstash adapter in a full ELK stack. A docker-compose.yml can be found in the example/ directory.

When logspout with adapter is running. Executing something like:

docker run --rm centos:7 echo hello from a container

Will result in a corresponding event in Elasticsearch. Below is a screenshot from Kibana4:

Credits

Thanks to Gliderlabs for creating Logspout!

Much thanks to all contributors.

For other credits see the header of the redis.go source file.

Documentation

Index

Constants

View Source
const (
	NO_MESSAGE_PROVIDED     = "no message"
	LOGTYPE_APPLICATIONLOG  = "applog"
	LOGTYPE_ACCESSLOG       = "accesslog"
	DEFAULT_CONNECT_TIMEOUT = 100
	DEFAULT_READ_TIMEOUT    = 300
	DEFAULT_WRITE_TIMEOUT   = 500
)

Variables

This section is empty.

Functions

func NewRedisAdapter

func NewRedisAdapter(route *router.Route) (router.LogAdapter, error)

Types

type DockerFields

type DockerFields struct {
	Name       string            `json:"name"`
	CID        string            `json:"cid"`
	Image      string            `json:"image"`
	ImageTag   string            `json:"image_tag,omitempty"`
	Source     string            `json:"source"`
	DockerHost string            `json:"docker_host,omitempty"`
	Labels     map[string]string `json:"labels,omitempty"`
}

type LogstashFields

type LogstashFields struct {
	Docker DockerFields `json:"docker"`
}

type LogstashMessageV0

type LogstashMessageV0 struct {
	Type       string         `json:"@type,omitempty"`
	Timestamp  string         `json:"@timestamp"`
	Sourcehost string         `json:"@source_host"`
	Message    string         `json:"@message"`
	Fields     LogstashFields `json:"@fields"`
}

type LogstashMessageV1

type LogstashMessageV1 struct {
	Type       string       `json:"@type,omitempty"`
	Timestamp  string       `json:"@timestamp"`
	Sourcehost string       `json:"host"`
	Message    string       `json:"message"`
	Fields     DockerFields `json:"docker"`
	Logtype    string       `json:"logtype,omitempty"`
	// Only one of the following 3 is initialized and used, depending on the incoming json:logtype
	LogtypeAccessfields map[string]interface{} `json:"accesslog,omitempty"`
	LogtypeAppfields    map[string]interface{} `json:"applog,omitempty"`
	LogtypeEventfields  map[string]interface{} `json:"event,omitempty"`
}

func (*LogstashMessageV1) UnmarshalDynamicJSON

func (d *LogstashMessageV1) UnmarshalDynamicJSON(data []byte) error

type RedisAdapter

type RedisAdapter struct {
	// contains filtered or unexported fields
}

func (*RedisAdapter) Stream

func (a *RedisAdapter) Stream(logstream chan *router.Message)

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL