Note: This project is in maintenance mode. There can be bug fixes, but no feature development.
Generic logging configuration library written in Go
This is generic logging configuration library that we at HelloFresh use in our projects to write applications logs to different log collecting solutions.
- Uses logrus as logging library
- Allows applying logging configuration from config file or environment variables, uses viper under the hood
- The following hooks/writers are available:
stderrstdoutdiscardaka/dev/nulllogstashsysloggraylog
go get -u github.com/hellofresh/logging-golevel: info
format: logstash
formatSettings:
type: MyService
ts: RFC3339Nano
writer: stderr
hooks:
- format: logstash
settings: {network: udp, host: logstash.mycompany.io, port: 8911, type: MyService, ts: RFC3339Nano}
- format: syslog
settings: {network: udp, host: localhost, port: 514, tag: MyService, facility: LOG_LOCAL0, severity: LOG_INFO}
- format: graylog
settings: {host: graylog.mycompany.io, port: 9000}
- format: stackdriver
settings: {service: myservice, version: v1}export LOG_LEVEL="info"
export LOG_FORMAT="logstash"
export LOG_FORMAT_SETTINGS="type=MyService,ts:RFC3339Nano"
export LOG_WRITER="stderr"
export LOG_HOOKS='[{"format":"logstash", "settings":{"type":"MyService","ts":"RFC3339Nano", "network": "udp","host":"logstash.mycompany.io","port": "8911"}},{"format":"syslog","settings":{"network": "udp", "host":"localhost", "port": "514", "tag": "MyService", "facility": "LOG_LOCAL0", "severity": "LOG_INFO"}},{"format":"graylog","settings":{"host":"graylog.mycompany.io","port":"9000"}},{"format":"stackdriver", "settings":{"service":"myservice","version":"v1"}}]'package main
import (
"github.com/hellofresh/logging-go"
log "github.com/sirupsen/logrus"
"github.com/spf13/viper"
)
func main() {
logging.InitDefaults(viper.GetViper(), "")
logConfig, err := logging.Load(viper.GetViper(), "/path/to/config.yml")
if nil != err {
panic(err)
}
err = logConfig.Apply()
if nil != err {
panic(err)
}
defer logConfig.Flush()
log.Info("Logger successfully initialised!")
}foo: rule
bar: 34
log:
level: info
format: json
output: stderr
hooks:
- format: logstash
settings: {network: udp, host: logstash.mycompany.io, port: 8911, type: MyService, ts: RFC3339Nano}
- format: syslog
settings: {network: udp, host: localhost, port: 514, tag: MyService, facility: LOG_LOCAL0, severity: LOG_INFO}
- format: graylog
settings: {host: graylog.mycompany.io, port: 9000}
- format: stackdriver
settings: {service: myservice, version: v1}
export APP_FOO="rule"
export APP_BAR="34"
export LOG_LEVEL="info"
export LOG_FORMAT="json"
export LOG_WRITER="stderr"
export LOG_HOOKS='[{"format":"logstash", "settings":{"type":"MyService","ts":"RFC3339Nano", "network": "udp","host":"logstash.mycompany.io","port": "8911"}},{"format":"syslog","settings":{"network": "udp", "host":"localhost", "port": "514", "tag": "MyService", "facility": "LOG_LOCAL0", "severity": "LOG_INFO"}},{"format":"graylog","settings":{"host":"graylog.mycompany.io","port":"9000"}},{"format":"stackdriver", "settings":{"service":"myservice","version":"v1"}}]'package main
import (
"github.com/hellofresh/logging-go"
log "github.com/sirupsen/logrus"
"github.com/spf13/viper"
)
func init() {
viper.SetDefault("foo", "foo")
viper.SetDefault("bar", 42)
logging.InitDefaults(viper.GetViper(), "log")
}
type AppConfig struct {
Foo string `envconfig:"APP_FOO"`
Bar int `envconfig:"APP_BAR"`
Log logging.LogConfig
}
func LoadAppConfig() (*AppConfig, error) {
var instance AppConfig
...
return &instance, nil
}
func main() {
appConfig, err := LoadAppConfig()
if nil != err {
panic(err)
}
err = appConfig.Log.Apply()
if nil != err {
panic(err)
}
defer appConfig.Log.Flush()
log.Info("Application successfully initialised!")
}package main
import (
"net/http"
"github.com/go-chi/chi"
"github.com/hellofresh/logging-go/middleware"
)
func main() {
appConfig, err := LoadAppConfig()
if nil != err {
panic(err)
}
err = appConfig.Log.Apply()
if nil != err {
panic(err)
}
defer appConfig.Log.Flush()
r := chi.NewRouter()
r.Use(middleware.New())
r.GET("/", func(c *gin.Context) {
c.JSON(http.StatusOK, "I'm producing logs!")
})
http.ListenAndServe(":8080", r)
}level(envLOG_LEVEL, default:info):panic,fatal,error,warn(warning),info,debug(seelogrus.ParseLevel())format(envLOG_FORMAT, default:json):text- plain textjson- all fields encoded into JSON stringlogstash- same asjsonbut includes additional logstash fields (e.g.@version) and format settings (see bellow)
formatSettings(envLOG_FORMAT_SETTINGS):type(used only forlogstashformat) - any valid string field that will be added to all log entriests(used only forlogstashformat) -timestampfield format, the following values are available:RFC3339,RFC3339Nano(becometime.RFC3339andtime.RFC3339Nanotimepackage constants)
writer(envLOG_WRITER, default:stderr):stderr,stdout,discardhooks(envLOG_HOOKS) - each hook has te following fields:formatandsettings. Currently te following formats are available:
Uses github.com/bshuster-repo/logrus-logstash-hook implementation
| Setting | Required | Description |
|---|---|---|
host |
YES | Logstash host name or IP address |
port |
YES | Logstash host port |
network |
YES | udp or tcp |
type |
no | same as formatSettings.type |
ts |
no | same as formatSettings.type |
Not supported on Windows.
Uses logstash implementation of log/syslog
| Setting | Required | Description |
|---|---|---|
host |
YES | Syslog host name or IP address |
port |
YES | Syslog host port |
network |
YES | udp or tcp |
severity |
YES | severity part of syslog priority (LOG_INFO, LOG_NOTICE, etc.) |
facility |
YES | facility part of syslog priority (LOG_LOCAL0, LOG_CRON, etc.) |
tag |
no | any valid string that will be sent to syslog as tag |
Uses github.com/gemnasium/logrus-graylog-hook implementation
| Setting | Required | Description |
|---|---|---|
host |
YES | Graylog host name or IP address |
port |
YES | Graylog host port |
async |
no | send log messages to Graylog in synchronous or asynchronous mode, string value must be parsable to bool |
Stackdriver formatter for Google Cloud Container Engine(GKE/Kubernetes).
Uses github.com/TV4/logrus-stackdriver-formatter implementation
| Setting | Required | Description |
|---|---|---|
service |
no | Optional Service Name referring to this logger |
version |
no | Optional Service version |
To start contributing, please check CONTRIBUTING.
hellofresh/logging-goDocs: https://godoc.org/github.com/hellofresh/logging-go- Go lang: https://golang.org/