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  }