summaryrefslogtreecommitdiffstats
path: root/pkg/config/logging.go
blob: 9ccd35e0152423252aa5cebf357daf87e94f4655 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
package config

import (
	"github.com/icinga/icingadb/pkg/logging"
	"github.com/pkg/errors"
	"go.uber.org/zap/zapcore"
	"os"
	"time"
)

// Logging defines Logger configuration.
type Logging struct {
	// zapcore.Level at 0 is for info level.
	Level  zapcore.Level `yaml:"level" default:"0"`
	Output string        `yaml:"output"`
	// Interval for periodic logging.
	Interval time.Duration `yaml:"interval" default:"20s"`

	logging.Options `yaml:"options"`
}

// Validate checks constraints in the supplied Logging configuration and returns an error if they are violated.
// Also configures the log output if it is not configured:
// systemd-journald is used when Icinga DB is running under systemd, otherwise stderr.
func (l *Logging) Validate() error {
	if l.Interval <= 0 {
		return errors.New("periodic logging interval must be positive")
	}

	if l.Output == "" {
		if _, ok := os.LookupEnv("NOTIFY_SOCKET"); ok {
			// When started by systemd, NOTIFY_SOCKET is set by systemd for Type=notify supervised services,
			// which is the default setting for the Icinga DB service.
			// This assumes that Icinga DB is running under systemd, so set output to systemd-journald.
			l.Output = logging.JOURNAL
		} else {
			// Otherwise set it to console, i.e. write log messages to stderr.
			l.Output = logging.CONSOLE
		}
	}

	// To be on the safe side, always call AssertOutput.
	return logging.AssertOutput(l.Output)
}