add json format support for traefik logs
This commit is contained in:
parent
2cbf9cae71
commit
837db9a2d9
6 changed files with 84 additions and 15 deletions
|
@ -153,6 +153,12 @@ func NewTraefikDefaultPointersConfiguration() *TraefikConfiguration {
|
||||||
var defaultEureka eureka.Provider
|
var defaultEureka eureka.Provider
|
||||||
defaultEureka.Delay = "30s"
|
defaultEureka.Delay = "30s"
|
||||||
|
|
||||||
|
// default TraefikLog
|
||||||
|
defaultTraefikLog := types.TraefikLog{
|
||||||
|
Format: "common",
|
||||||
|
FilePath: "",
|
||||||
|
}
|
||||||
|
|
||||||
// default AccessLog
|
// default AccessLog
|
||||||
defaultAccessLog := types.AccessLog{
|
defaultAccessLog := types.AccessLog{
|
||||||
Format: accesslog.CommonFormat,
|
Format: accesslog.CommonFormat,
|
||||||
|
@ -177,6 +183,7 @@ func NewTraefikDefaultPointersConfiguration() *TraefikConfiguration {
|
||||||
DynamoDB: &defaultDynamoDB,
|
DynamoDB: &defaultDynamoDB,
|
||||||
Retry: &configuration.Retry{},
|
Retry: &configuration.Retry{},
|
||||||
HealthCheck: &configuration.HealthCheckConfig{},
|
HealthCheck: &configuration.HealthCheckConfig{},
|
||||||
|
TraefikLog: &defaultTraefikLog,
|
||||||
AccessLog: &defaultAccessLog,
|
AccessLog: &defaultAccessLog,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -265,15 +265,36 @@ func run(globalConfiguration *configuration.GlobalConfiguration) {
|
||||||
log.Error("Error getting level", err)
|
log.Error("Error getting level", err)
|
||||||
}
|
}
|
||||||
log.SetLevel(level)
|
log.SetLevel(level)
|
||||||
if len(globalConfiguration.TraefikLogsFile) > 0 {
|
|
||||||
dir := filepath.Dir(globalConfiguration.TraefikLogsFile)
|
logFile := globalConfiguration.TraefikLogsFile
|
||||||
|
if len(logFile) > 0 {
|
||||||
|
log.Warn("top-level traefiklogsfile has been deprecated -- please use traefiklog.filepath")
|
||||||
|
}
|
||||||
|
if globalConfiguration.TraefikLog != nil && len(globalConfiguration.TraefikLog.FilePath) > 0 {
|
||||||
|
logFile = globalConfiguration.TraefikLog.FilePath
|
||||||
|
}
|
||||||
|
|
||||||
|
var formatter logrus.Formatter
|
||||||
|
if globalConfiguration.TraefikLog != nil && globalConfiguration.TraefikLog.Format == "json" {
|
||||||
|
formatter = &logrus.JSONFormatter{}
|
||||||
|
} else {
|
||||||
|
disableColors := false
|
||||||
|
if len(logFile) > 0 {
|
||||||
|
disableColors = true
|
||||||
|
}
|
||||||
|
formatter = &logrus.TextFormatter{DisableColors: disableColors, FullTimestamp: true, DisableSorting: true}
|
||||||
|
}
|
||||||
|
log.SetFormatter(formatter)
|
||||||
|
|
||||||
|
if len(logFile) > 0 {
|
||||||
|
dir := filepath.Dir(logFile)
|
||||||
|
|
||||||
err := os.MkdirAll(dir, 0755)
|
err := os.MkdirAll(dir, 0755)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Errorf("Failed to create log path %s: %s", dir, err)
|
log.Errorf("Failed to create log path %s: %s", dir, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
err = log.OpenFile(globalConfiguration.TraefikLogsFile)
|
err = log.OpenFile(logFile)
|
||||||
defer func() {
|
defer func() {
|
||||||
if err := log.CloseFile(); err != nil {
|
if err := log.CloseFile(); err != nil {
|
||||||
log.Error("Error closing log", err)
|
log.Error("Error closing log", err)
|
||||||
|
@ -281,12 +302,9 @@ func run(globalConfiguration *configuration.GlobalConfiguration) {
|
||||||
}()
|
}()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Error("Error opening file", err)
|
log.Error("Error opening file", err)
|
||||||
} else {
|
|
||||||
log.SetFormatter(&logrus.TextFormatter{DisableColors: true, FullTimestamp: true, DisableSorting: true})
|
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
log.SetFormatter(&logrus.TextFormatter{FullTimestamp: true, DisableSorting: true})
|
|
||||||
}
|
}
|
||||||
|
|
||||||
jsonConf, _ := json.Marshal(globalConfiguration)
|
jsonConf, _ := json.Marshal(globalConfiguration)
|
||||||
log.Infof("Traefik version %s built on %s", version.Version, version.BuildDate)
|
log.Infof("Traefik version %s built on %s", version.Version, version.BuildDate)
|
||||||
|
|
||||||
|
|
|
@ -47,7 +47,8 @@ type GlobalConfiguration struct {
|
||||||
CheckNewVersion bool `description:"Periodically check if a new version has been released"`
|
CheckNewVersion bool `description:"Periodically check if a new version has been released"`
|
||||||
AccessLogsFile string `description:"(Deprecated) Access logs file"` // Deprecated
|
AccessLogsFile string `description:"(Deprecated) Access logs file"` // Deprecated
|
||||||
AccessLog *types.AccessLog `description:"Access log settings"`
|
AccessLog *types.AccessLog `description:"Access log settings"`
|
||||||
TraefikLogsFile string `description:"Traefik logs file. Stdout is used when omitted or empty"`
|
TraefikLogsFile string `description:"(Deprecated) Traefik logs file. Stdout is used when omitted or empty"` // Deprecated
|
||||||
|
TraefikLog *types.TraefikLog `description:"Traefik log settings"`
|
||||||
LogLevel string `short:"l" description:"Log level"`
|
LogLevel string `short:"l" description:"Log level"`
|
||||||
EntryPoints EntryPoints `description:"Entrypoints definition using format: --entryPoints='Name:http Address::8000 Redirect.EntryPoint:https' --entryPoints='Name:https Address::4442 TLS:tests/traefik.crt,tests/traefik.key;prod/traefik.crt,prod/traefik.key'"`
|
EntryPoints EntryPoints `description:"Entrypoints definition using format: --entryPoints='Name:http Address::8000 Redirect.EntryPoint:https' --entryPoints='Name:https Address::4442 TLS:tests/traefik.crt,tests/traefik.key;prod/traefik.crt,prod/traefik.key'"`
|
||||||
Cluster *types.Cluster `description:"Enable clustering"`
|
Cluster *types.Cluster `description:"Enable clustering"`
|
||||||
|
|
|
@ -152,6 +152,11 @@ constraints = ["tag==api", "tag!=v*-beta"]
|
||||||
```toml
|
```toml
|
||||||
# Traefik logs file
|
# Traefik logs file
|
||||||
# If not defined, logs to stdout
|
# If not defined, logs to stdout
|
||||||
|
#
|
||||||
|
# DEPRECATED - see [traefikLog] lower down
|
||||||
|
# In case both traefikLogsFile and traefikLog.filePath are specified, the latter will take precedence.
|
||||||
|
# Optional
|
||||||
|
#
|
||||||
traefikLogsFile = "log/traefik.log"
|
traefikLogsFile = "log/traefik.log"
|
||||||
|
|
||||||
# Log level
|
# Log level
|
||||||
|
@ -165,6 +170,23 @@ traefikLogsFile = "log/traefik.log"
|
||||||
logLevel = "ERROR"
|
logLevel = "ERROR"
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## Traefik Logs
|
||||||
|
|
||||||
|
By default the Traefik log is written to stdout in text format.
|
||||||
|
|
||||||
|
To write the logs into a logfile specify the `filePath`.
|
||||||
|
```toml
|
||||||
|
[traefikLog]
|
||||||
|
filePath = "/path/to/traefik.log"
|
||||||
|
```
|
||||||
|
|
||||||
|
To write JSON format logs, specify `json` as the format:
|
||||||
|
```toml
|
||||||
|
[traefikLog]
|
||||||
|
filePath = "/path/to/traefik.log"
|
||||||
|
format = "json"
|
||||||
|
```
|
||||||
|
|
||||||
### Access Logs
|
### Access Logs
|
||||||
|
|
||||||
Access logs are written when `[accessLog]` is defined.
|
Access logs are written when `[accessLog]` is defined.
|
||||||
|
|
|
@ -9,13 +9,6 @@
|
||||||
#
|
#
|
||||||
# debug = true
|
# debug = true
|
||||||
|
|
||||||
# Traefik logs file
|
|
||||||
# If not defined, logs to stdout
|
|
||||||
#
|
|
||||||
# Optional
|
|
||||||
#
|
|
||||||
# traefikLogsFile = "log/traefik.log"
|
|
||||||
|
|
||||||
# Log level
|
# Log level
|
||||||
#
|
#
|
||||||
# Optional
|
# Optional
|
||||||
|
@ -39,6 +32,28 @@
|
||||||
[entryPoints.http]
|
[entryPoints.http]
|
||||||
address = ":80"
|
address = ":80"
|
||||||
|
|
||||||
|
# Traefik logs
|
||||||
|
# Enabled by default and log to stdout
|
||||||
|
#
|
||||||
|
# Optional
|
||||||
|
#
|
||||||
|
# [traefikLog]
|
||||||
|
|
||||||
|
# Sets the filepath for the traefik log. If not specified, stdout will be used.
|
||||||
|
# Intermediate directories are created if necessary.
|
||||||
|
#
|
||||||
|
# Optional
|
||||||
|
# Default: os.Stdout
|
||||||
|
#
|
||||||
|
# filePath = "log/traefik.log"
|
||||||
|
|
||||||
|
# Format is either "json" or "common".
|
||||||
|
#
|
||||||
|
# Optional
|
||||||
|
# Default: "common"
|
||||||
|
#
|
||||||
|
# format = "common"
|
||||||
|
|
||||||
# Enable access logs
|
# Enable access logs
|
||||||
# By default it will write to stdout and produce logs in the textual
|
# By default it will write to stdout and produce logs in the textual
|
||||||
# Common Log Format (CLF), extended with additional fields.
|
# Common Log Format (CLF), extended with additional fields.
|
||||||
|
|
|
@ -412,6 +412,12 @@ func (b *Buckets) SetValue(val interface{}) {
|
||||||
*b = Buckets(val.(Buckets))
|
*b = Buckets(val.(Buckets))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TraefikLog holds the configuration settings for the traefik logger.
|
||||||
|
type TraefikLog struct {
|
||||||
|
FilePath string `json:"file,omitempty" description:"Traefik log file path. Stdout is used when omitted or empty"`
|
||||||
|
Format string `json:"format,omitempty" description:"Traefik log format: json | common"`
|
||||||
|
}
|
||||||
|
|
||||||
// AccessLog holds the configuration settings for the access logger (middlewares/accesslog).
|
// AccessLog holds the configuration settings for the access logger (middlewares/accesslog).
|
||||||
type AccessLog struct {
|
type AccessLog struct {
|
||||||
FilePath string `json:"file,omitempty" description:"Access log file path. Stdout is used when omitted or empty"`
|
FilePath string `json:"file,omitempty" description:"Access log file path. Stdout is used when omitted or empty"`
|
||||||
|
|
Loading…
Reference in a new issue