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:
stderr
stdout
discard
aka/dev/null
logstash
syslog
graylog
go get -u github.com/hellofresh/logging-go
level: 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 asjson
but includes additional logstash fields (e.g.@version
) and format settings (see bellow)
formatSettings
(envLOG_FORMAT_SETTINGS
):type
(used only forlogstash
format) - any valid string field that will be added to all log entriests
(used only forlogstash
format) -timestamp
field format, the following values are available:RFC3339
,RFC3339Nano
(becometime.RFC3339
andtime.RFC3339Nano
time
package constants)
writer
(envLOG_WRITER
, default:stderr
):stderr
,stdout
,discard
hooks
(envLOG_HOOKS
) - each hook has te following fields:format
andsettings
. 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-go
Docs: https://godoc.org/github.com/hellofresh/logging-go- Go lang: https://golang.org/