logging.go 1.97 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12
package main

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

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

14 15 16 17
	"gitlab.com/gitlab-org/gitlab-workhorse/internal/helper"
)

func reopenLogWriter(l reopen.WriteCloser, sighup chan os.Signal) {
18
	for range sighup {
19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
		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 (
38 39 40 41
	jsonLogFormat    = "json"
	textLogFormat    = "text"
	structuredFormat = "structured"
	noneLogType      = "none"
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
)

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{})
74 75 76 77
	case structuredFormat:
		formatter := &log.TextFormatter{ForceColors: true, EnvironmentOverrideColors: true}
		log.SetFormatter(formatter)
		accessLogEntry = log.WithField("system", "http")
78 79 80 81 82 83 84 85 86 87 88
	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)

}