Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
lima-vm
GitHub Repository: lima-vm/lima
Path: blob/master/pkg/logrusutil/logrusutil.go
2601 views
1
// SPDX-FileCopyrightText: Copyright The Lima Authors
2
// SPDX-License-Identifier: Apache-2.0
3
4
package logrusutil
5
6
import (
7
"encoding/json"
8
"strings"
9
"time"
10
11
"github.com/sirupsen/logrus"
12
)
13
14
const epsilon = 1 * time.Second
15
16
// PropagateJSON propagates JSONFormatter lines.
17
//
18
// PanicLevel and FatalLevel are converted to ErrorLevel.
19
func PropagateJSON(logger *logrus.Logger, jsonLine []byte, header string, begin time.Time) {
20
if strings.TrimSpace(string(jsonLine)) == "" {
21
return
22
}
23
24
var (
25
entry *logrus.Entry
26
fields logrus.Fields
27
lv logrus.Level
28
j JSON
29
err error
30
)
31
entry = logrus.NewEntry(logger)
32
33
if err := json.Unmarshal(jsonLine, &j); err != nil {
34
goto fallback
35
}
36
if !j.Time.IsZero() && !begin.IsZero() && begin.After(j.Time.Add(epsilon)) {
37
return
38
}
39
lv, err = logrus.ParseLevel(j.Level)
40
if err != nil {
41
goto fallback
42
}
43
entry = entry.WithTime(j.Time)
44
// Unmarshal jsonLine once more to capture all the "extra" fields that have been added by
45
// WithError() and WithField(). The regular fields "level", "msg", and "time" are already
46
// unmarshalled into j and are handled specially. They must not be added again.
47
if err := json.Unmarshal(jsonLine, &fields); err == nil {
48
delete(fields, "level")
49
delete(fields, "msg")
50
delete(fields, "time")
51
entry = entry.WithFields(fields)
52
}
53
// Don't exit on Fatal or Panic entries
54
if lv <= logrus.FatalLevel {
55
entry = entry.WithField("level", lv)
56
lv = logrus.ErrorLevel
57
}
58
entry.Log(lv, header+j.Msg)
59
return
60
61
fallback:
62
entry.Info(header + string(jsonLine))
63
}
64
65
// JSON is the type used in logrus.JSONFormatter.
66
type JSON struct {
67
Level string `json:"level"`
68
Msg string `json:"msg"`
69
Time time.Time `json:"time"`
70
}
71
72