Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
aos
GitHub Repository: aos/grafana-agent
Path: blob/main/component/common/loki/client/logger.go
4096 views
1
package client
2
3
// This code is copied from Promtail. The client package is used to configure
4
// and run the clients that can send log entries to a Loki instance.
5
6
import (
7
"fmt"
8
"os"
9
"runtime"
10
"sync"
11
"text/tabwriter"
12
13
"github.com/fatih/color"
14
"github.com/go-kit/log"
15
"github.com/grafana/agent/component/common/loki"
16
"gopkg.in/yaml.v2"
17
)
18
19
var (
20
yellow = color.New(color.FgYellow)
21
blue = color.New(color.FgBlue)
22
)
23
24
func init() {
25
if runtime.GOOS == "windows" {
26
yellow.DisableColor()
27
blue.DisableColor()
28
}
29
}
30
31
type logger struct {
32
*tabwriter.Writer
33
sync.Mutex
34
entries chan loki.Entry
35
36
once sync.Once
37
}
38
39
// NewLogger creates a new client logger that logs entries instead of sending them.
40
func NewLogger(metrics *Metrics, streamLogLabels []string, log log.Logger, cfgs ...Config) (Client, error) {
41
// make sure the clients config is valid
42
c, err := NewMulti(metrics, streamLogLabels, log, 0, cfgs...)
43
if err != nil {
44
return nil, err
45
}
46
c.Stop()
47
48
fmt.Println(yellow.Sprint("Clients configured:"))
49
for _, cfg := range cfgs {
50
yaml, err := yaml.Marshal(cfg)
51
if err != nil {
52
return nil, err
53
}
54
fmt.Println("----------------------")
55
fmt.Println(string(yaml))
56
}
57
entries := make(chan loki.Entry)
58
l := &logger{
59
Writer: tabwriter.NewWriter(os.Stdout, 0, 8, 0, '\t', 0),
60
entries: entries,
61
}
62
go l.run()
63
return l, nil
64
}
65
66
func (l *logger) Stop() {
67
l.once.Do(func() { close(l.entries) })
68
}
69
70
func (l *logger) Chan() chan<- loki.Entry {
71
return l.entries
72
}
73
74
func (l *logger) run() {
75
for e := range l.entries {
76
fmt.Fprint(l.Writer, blue.Sprint(e.Timestamp.Format("2006-01-02T15:04:05.999999999-0700")))
77
fmt.Fprint(l.Writer, "\t")
78
fmt.Fprint(l.Writer, yellow.Sprint(e.Labels.String()))
79
fmt.Fprint(l.Writer, "\t")
80
fmt.Fprint(l.Writer, e.Line)
81
fmt.Fprint(l.Writer, "\n")
82
_ = l.Flush()
83
}
84
}
85
func (l *logger) StopNow() { l.Stop() }
86
87
func (l *logger) Name() string {
88
return ""
89
}
90
91