Config Option to Enable Logging with Local Time (#9123)
* Configurable local time logging * make timezone configurable * Address linter feedback. * update with example
This commit is contained in:
parent
e9a69a0c6b
commit
1a86fd1a2d
|
|
@ -174,6 +174,7 @@ func runAgent(ctx context.Context,
|
||||||
RotationInterval: ag.Config.Agent.LogfileRotationInterval,
|
RotationInterval: ag.Config.Agent.LogfileRotationInterval,
|
||||||
RotationMaxSize: ag.Config.Agent.LogfileRotationMaxSize,
|
RotationMaxSize: ag.Config.Agent.LogfileRotationMaxSize,
|
||||||
RotationMaxArchives: ag.Config.Agent.LogfileRotationMaxArchives,
|
RotationMaxArchives: ag.Config.Agent.LogfileRotationMaxArchives,
|
||||||
|
LogWithTimezone: ag.Config.Agent.LogWithTimezone,
|
||||||
}
|
}
|
||||||
|
|
||||||
logger.SetupLogging(logConfig)
|
logger.SetupLogging(logConfig)
|
||||||
|
|
|
||||||
|
|
@ -188,6 +188,9 @@ type AgentConfig struct {
|
||||||
// If set to -1, no archives are removed.
|
// If set to -1, no archives are removed.
|
||||||
LogfileRotationMaxArchives int `toml:"logfile_rotation_max_archives"`
|
LogfileRotationMaxArchives int `toml:"logfile_rotation_max_archives"`
|
||||||
|
|
||||||
|
// Pick a timezone to use when logging or type 'local' for local time.
|
||||||
|
LogWithTimezone string `toml:"log_with_timezone"`
|
||||||
|
|
||||||
Hostname string
|
Hostname string
|
||||||
OmitHostname bool
|
OmitHostname bool
|
||||||
}
|
}
|
||||||
|
|
@ -356,11 +359,14 @@ var agentConfig = `
|
||||||
## If set to -1, no archives are removed.
|
## If set to -1, no archives are removed.
|
||||||
# logfile_rotation_max_archives = 5
|
# logfile_rotation_max_archives = 5
|
||||||
|
|
||||||
|
## Pick a timezone to use when logging or type 'local' for local time.
|
||||||
|
## Example: America/Chicago
|
||||||
|
# log_with_timezone = ""
|
||||||
|
|
||||||
## Override default hostname, if empty use os.Hostname()
|
## Override default hostname, if empty use os.Hostname()
|
||||||
hostname = ""
|
hostname = ""
|
||||||
## If set to true, do no set the "host" tag in the telegraf agent.
|
## If set to true, do no set the "host" tag in the telegraf agent.
|
||||||
omit_hostname = false
|
omit_hostname = false
|
||||||
|
|
||||||
`
|
`
|
||||||
|
|
||||||
var outputHeader = `
|
var outputHeader = `
|
||||||
|
|
|
||||||
|
|
@ -219,6 +219,10 @@ The agent table configures Telegraf and the defaults used across all plugins.
|
||||||
Maximum number of rotated archives to keep, any older logs are deleted. If
|
Maximum number of rotated archives to keep, any older logs are deleted. If
|
||||||
set to -1, no archives are removed.
|
set to -1, no archives are removed.
|
||||||
|
|
||||||
|
- **log_with_timezone**:
|
||||||
|
Pick a timezone to use when logging or type 'local' for local time. Example: 'America/Chicago'.
|
||||||
|
[See this page for options/formats.](https://socketloop.com/tutorials/golang-display-list-of-timezones-with-gmt)
|
||||||
|
|
||||||
- **hostname**:
|
- **hostname**:
|
||||||
Override default hostname, if empty use os.Hostname()
|
Override default hostname, if empty use os.Hostname()
|
||||||
- **omit_hostname**:
|
- **omit_hostname**:
|
||||||
|
|
|
||||||
|
|
@ -90,6 +90,10 @@
|
||||||
## If set to -1, no archives are removed.
|
## If set to -1, no archives are removed.
|
||||||
# logfile_rotation_max_archives = 5
|
# logfile_rotation_max_archives = 5
|
||||||
|
|
||||||
|
## Pick a timezone to use when logging or type 'local' for local time. Example: 'America/Chicago'.
|
||||||
|
## See https://socketloop.com/tutorials/golang-display-list-of-timezones-with-gmt for timezone formatting options.
|
||||||
|
# log_with_timezone = ""
|
||||||
|
|
||||||
## Override default hostname, if empty use os.Hostname()
|
## Override default hostname, if empty use os.Hostname()
|
||||||
hostname = ""
|
hostname = ""
|
||||||
## If set to true, do no set the "host" tag in the telegraf agent.
|
## If set to true, do no set the "host" tag in the telegraf agent.
|
||||||
|
|
|
||||||
|
|
@ -90,6 +90,10 @@
|
||||||
## If set to -1, no archives are removed.
|
## If set to -1, no archives are removed.
|
||||||
# logfile_rotation_max_archives = 5
|
# logfile_rotation_max_archives = 5
|
||||||
|
|
||||||
|
## Pick a timezone to use when logging or type 'local' for local time. Example: 'America/Chicago'.
|
||||||
|
## See https://socketloop.com/tutorials/golang-display-list-of-timezones-with-gmt for timezone formatting options.
|
||||||
|
# log_with_timezone = ""
|
||||||
|
|
||||||
## Override default hostname, if empty use os.Hostname()
|
## Override default hostname, if empty use os.Hostname()
|
||||||
hostname = ""
|
hostname = ""
|
||||||
## If set to true, do no set the "host" tag in the telegraf agent.
|
## If set to true, do no set the "host" tag in the telegraf agent.
|
||||||
|
|
|
||||||
|
|
@ -6,6 +6,7 @@ import (
|
||||||
"log"
|
"log"
|
||||||
"os"
|
"os"
|
||||||
"regexp"
|
"regexp"
|
||||||
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/influxdata/telegraf/config"
|
"github.com/influxdata/telegraf/config"
|
||||||
|
|
@ -38,6 +39,8 @@ type LogConfig struct {
|
||||||
RotationMaxSize config.Size
|
RotationMaxSize config.Size
|
||||||
// maximum rotated files to keep (older ones will be deleted)
|
// maximum rotated files to keep (older ones will be deleted)
|
||||||
RotationMaxArchives int
|
RotationMaxArchives int
|
||||||
|
// pick a timezone to use when logging. or type 'local' for local time.
|
||||||
|
LogWithTimezone string
|
||||||
}
|
}
|
||||||
|
|
||||||
type LoggerCreator interface {
|
type LoggerCreator interface {
|
||||||
|
|
@ -56,15 +59,19 @@ func registerLogger(name string, loggerCreator LoggerCreator) {
|
||||||
type telegrafLog struct {
|
type telegrafLog struct {
|
||||||
writer io.Writer
|
writer io.Writer
|
||||||
internalWriter io.Writer
|
internalWriter io.Writer
|
||||||
|
timezone *time.Location
|
||||||
}
|
}
|
||||||
|
|
||||||
func (t *telegrafLog) Write(b []byte) (n int, err error) {
|
func (t *telegrafLog) Write(b []byte) (n int, err error) {
|
||||||
var line []byte
|
var line []byte
|
||||||
|
timeToPrint := time.Now().In(t.timezone)
|
||||||
|
|
||||||
if !prefixRegex.Match(b) {
|
if !prefixRegex.Match(b) {
|
||||||
line = append([]byte(time.Now().UTC().Format(time.RFC3339)+" I! "), b...)
|
line = append([]byte(timeToPrint.Format(time.RFC3339)+" I! "), b...)
|
||||||
} else {
|
} else {
|
||||||
line = append([]byte(time.Now().UTC().Format(time.RFC3339)+" "), b...)
|
line = append([]byte(timeToPrint.Format(time.RFC3339)+" "), b...)
|
||||||
}
|
}
|
||||||
|
|
||||||
return t.writer.Write(line)
|
return t.writer.Write(line)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -82,11 +89,23 @@ func (t *telegrafLog) Close() error {
|
||||||
}
|
}
|
||||||
|
|
||||||
// newTelegrafWriter returns a logging-wrapped writer.
|
// newTelegrafWriter returns a logging-wrapped writer.
|
||||||
func newTelegrafWriter(w io.Writer) io.Writer {
|
func newTelegrafWriter(w io.Writer, c LogConfig) (io.Writer, error) {
|
||||||
|
timezoneName := c.LogWithTimezone
|
||||||
|
|
||||||
|
if strings.ToLower(timezoneName) == "local" {
|
||||||
|
timezoneName = "Local"
|
||||||
|
}
|
||||||
|
|
||||||
|
tz, err := time.LoadLocation(timezoneName)
|
||||||
|
if err != nil {
|
||||||
|
return nil, errors.New("error while setting logging timezone: " + err.Error())
|
||||||
|
}
|
||||||
|
|
||||||
return &telegrafLog{
|
return &telegrafLog{
|
||||||
writer: wlog.NewWriter(w),
|
writer: wlog.NewWriter(w),
|
||||||
internalWriter: w,
|
internalWriter: w,
|
||||||
}
|
timezone: tz,
|
||||||
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// SetupLogging configures the logging output.
|
// SetupLogging configures the logging output.
|
||||||
|
|
@ -119,7 +138,7 @@ func (t *telegrafLogCreator) CreateLogger(config LogConfig) (io.Writer, error) {
|
||||||
writer = defaultWriter
|
writer = defaultWriter
|
||||||
}
|
}
|
||||||
|
|
||||||
return newTelegrafWriter(writer), nil
|
return newTelegrafWriter(writer, config)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Keep track what is actually set as a log output, because log package doesn't provide a getter.
|
// Keep track what is actually set as a log output, because log package doesn't provide a getter.
|
||||||
|
|
|
||||||
|
|
@ -137,7 +137,10 @@ func TestLogTargetSettings(t *testing.T) {
|
||||||
func BenchmarkTelegrafLogWrite(b *testing.B) {
|
func BenchmarkTelegrafLogWrite(b *testing.B) {
|
||||||
var msg = []byte("test")
|
var msg = []byte("test")
|
||||||
var buf bytes.Buffer
|
var buf bytes.Buffer
|
||||||
w := newTelegrafWriter(&buf)
|
w, err := newTelegrafWriter(&buf, LogConfig{})
|
||||||
|
if err != nil {
|
||||||
|
panic("Unable to create log writer.")
|
||||||
|
}
|
||||||
for i := 0; i < b.N; i++ {
|
for i := 0; i < b.N; i++ {
|
||||||
buf.Reset()
|
buf.Reset()
|
||||||
w.Write(msg)
|
w.Write(msg)
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue