File: logging.go

package info (click to toggle)
gitlab-workhorse 7.6.0%2Bdebian-1
  • links: PTS, VCS
  • area: main
  • in suites: buster
  • size: 7,440 kB
  • sloc: makefile: 233; sh: 161; python: 15
file content (88 lines) | stat: -rw-r--r-- 2,017 bytes parent folder | download
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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
package main

import (
	"io"
	"io/ioutil"
	goLog "log"
	"os"
	"os/signal"
	"syscall"

	"github.com/client9/reopen"
	log "github.com/sirupsen/logrus"

	"gitlab.com/gitlab-org/gitlab-workhorse/internal/helper"
)

func reopenLogWriter(l reopen.WriteCloser, sighup chan os.Signal) {
	for range sighup {
		log.Print("Reopening log file")
		l.Reopen()
	}
}

func prepareLoggingFile(logFile string) *reopen.FileWriter {
	file, err := reopen.NewFileWriter(logFile)
	if err != nil {
		goLog.Fatalf("Unable to set output log: %s", err)
	}

	sighup := make(chan os.Signal, 1)
	signal.Notify(sighup, syscall.SIGHUP)

	go reopenLogWriter(file, sighup)
	return file
}

const (
	jsonLogFormat    = "json"
	textLogFormat    = "text"
	structuredFormat = "structured"
	noneLogType      = "none"
)

type logConfiguration struct {
	logFile   string
	logFormat string
}

func startLogging(config logConfiguration) {
	var accessLogEntry *log.Entry
	var logOutputWriter io.Writer

	if config.logFile != "" {
		logOutputWriter = prepareLoggingFile(config.logFile)
	} else {
		logOutputWriter = os.Stderr
	}

	switch config.logFormat {
	case noneLogType:
		accessLogEntry = nil
		logOutputWriter = ioutil.Discard
	case jsonLogFormat:
		accessLogEntry = log.WithField("system", "http")
		log.SetFormatter(&log.JSONFormatter{})
	case textLogFormat:
		accessLogger := log.New()
		accessLogger.Formatter = helper.NewAccessLogFormatter()
		accessLogger.Out = logOutputWriter
		accessLogger.SetLevel(log.InfoLevel)
		accessLogEntry = accessLogger.WithField("system", "http")

		log.SetFormatter(&log.TextFormatter{})
	case structuredFormat:
		formatter := &log.TextFormatter{ForceColors: true, EnvironmentOverrideColors: true}
		log.SetFormatter(formatter)
		accessLogEntry = log.WithField("system", "http")
	default:
		log.WithField("logFormat", config.logFormat).Fatal("Unknown logFormat configured")
	}

	helper.SetAccessLoggerEntry(accessLogEntry)
	log.SetOutput(logOutputWriter)

	// Golog always goes to stderr
	goLog.SetOutput(os.Stderr)

}