github.com/ddev/ddev@v1.23.2-0.20240519125000-d824ffe36ff3/pkg/output/sirupsen_orig/json_formatter.go.sirupsen (about)

     1  package logrus
     2  
     3  import (
     4  	"encoding/json"
     5  	"fmt"
     6  )
     7  
     8  type fieldKey string
     9  
    10  // FieldMap allows customization of the key names for default fields.
    11  type FieldMap map[fieldKey]string
    12  
    13  // Default key names for the default fields
    14  const (
    15  	FieldKeyMsg   = "msg"
    16  	FieldKeyLevel = "level"
    17  	FieldKeyTime  = "time"
    18  )
    19  
    20  func (f FieldMap) resolve(key fieldKey) string {
    21  	if k, ok := f[key]; ok {
    22  		return k
    23  	}
    24  
    25  	return string(key)
    26  }
    27  
    28  // JSONFormatter formats logs into parsable json
    29  type JSONFormatter struct {
    30  	// TimestampFormat sets the format used for marshaling timestamps.
    31  	TimestampFormat string
    32  
    33  	// DisableTimestamp allows disabling automatic timestamps in output
    34  	DisableTimestamp bool
    35  
    36  	// FieldMap allows users to customize the names of keys for default fields.
    37  	// As an example:
    38  	// formatter := &JSONFormatter{
    39  	//   	FieldMap: FieldMap{
    40  	// 		 FieldKeyTime: "@timestamp",
    41  	// 		 FieldKeyLevel: "@level",
    42  	// 		 FieldKeyMsg: "@message",
    43  	//    },
    44  	// }
    45  	FieldMap FieldMap
    46  }
    47  
    48  // Format renders a single log entry
    49  func (f *JSONFormatter) Format(entry *Entry) ([]byte, error) {
    50  	data := make(Fields, len(entry.Data)+3)
    51  	for k, v := range entry.Data {
    52  		switch v := v.(type) {
    53  		case error:
    54  			// Otherwise errors are ignored by `encoding/json`
    55  			// https://github.com/sirupsen/logrus/issues/137
    56  			data[k] = v.Error()
    57  		default:
    58  			data[k] = v
    59  		}
    60  	}
    61  	prefixFieldClashes(data)
    62  
    63  	timestampFormat := f.TimestampFormat
    64  	if timestampFormat == "" {
    65  		timestampFormat = defaultTimestampFormat
    66  	}
    67  
    68  	if !f.DisableTimestamp {
    69  		data[f.FieldMap.resolve(FieldKeyTime)] = entry.Time.Format(timestampFormat)
    70  	}
    71  	data[f.FieldMap.resolve(FieldKeyMsg)] = entry.Message
    72  	data[f.FieldMap.resolve(FieldKeyLevel)] = entry.Level.String()
    73  
    74  	serialized, err := json.Marshal(data)
    75  	if err != nil {
    76  		return nil, fmt.Errorf("Failed to marshal fields to JSON, %v", err)
    77  	}
    78  	return append(serialized, '\n'), nil
    79  }