github.com/secure-build/gitlab-runner@v12.5.0+incompatible/log/runner_formatter.go (about) 1 package log 2 3 import ( 4 "bytes" 5 "fmt" 6 "sort" 7 8 "github.com/sirupsen/logrus" 9 10 "gitlab.com/gitlab-org/gitlab-runner/helpers" 11 ) 12 13 type RunnerTextFormatter struct { 14 // Force disabling colors. 15 DisableColors bool 16 17 // The fields are sorted by default for a consistent output. For applications 18 // that log extremely frequently and don't use the JSON formatter this may not 19 // be desired. 20 DisableSorting bool 21 } 22 23 func (f *RunnerTextFormatter) Format(entry *logrus.Entry) ([]byte, error) { 24 b := new(bytes.Buffer) 25 f.printColored(b, entry) 26 b.WriteByte('\n') 27 28 return b.Bytes(), nil 29 } 30 31 func (f *RunnerTextFormatter) printColored(b *bytes.Buffer, entry *logrus.Entry) { 32 levelColor, resetColor, levelPrefix := f.getColorsAndPrefix(entry) 33 indentLength := 50 - len(levelPrefix) 34 35 fmt.Fprintf(b, "%s%s%-*s%s ", levelColor, levelPrefix, indentLength, entry.Message, resetColor) 36 for _, k := range f.prepareKeys(entry) { 37 v := entry.Data[k] 38 fmt.Fprintf(b, " %s%s%s=%v", levelColor, k, resetColor, v) 39 } 40 } 41 42 func (f *RunnerTextFormatter) getColorsAndPrefix(entry *logrus.Entry) (string, string, string) { 43 definitions := map[logrus.Level]struct { 44 color string 45 prefix string 46 }{ 47 logrus.DebugLevel: { 48 color: helpers.ANSI_BOLD_WHITE, 49 }, 50 logrus.WarnLevel: { 51 color: helpers.ANSI_YELLOW, 52 prefix: "WARNING: ", 53 }, 54 logrus.ErrorLevel: { 55 color: helpers.ANSI_BOLD_RED, 56 prefix: "ERROR: ", 57 }, 58 logrus.FatalLevel: { 59 color: helpers.ANSI_BOLD_RED, 60 prefix: "FATAL: ", 61 }, 62 logrus.PanicLevel: { 63 color: helpers.ANSI_BOLD_RED, 64 prefix: "PANIC: ", 65 }, 66 } 67 68 color := "" 69 prefix := "" 70 71 definition, ok := definitions[entry.Level] 72 if ok { 73 if definition.color != "" { 74 color = definition.color 75 } 76 77 if definition.prefix != "" { 78 prefix = definition.prefix 79 } 80 } 81 82 if f.DisableColors { 83 return "", "", prefix 84 } 85 86 return color, helpers.ANSI_RESET, prefix 87 } 88 89 func (f *RunnerTextFormatter) prepareKeys(entry *logrus.Entry) []string { 90 keys := make([]string, 0, len(entry.Data)) 91 92 for k := range entry.Data { 93 keys = append(keys, k) 94 } 95 96 if !f.DisableSorting { 97 sort.Strings(keys) 98 } 99 100 return keys 101 } 102 103 func SetRunnerFormatter() { 104 logrus.SetFormatter(new(RunnerTextFormatter)) 105 }