Path: blob/main/component/common/loki/client/logger.go
4096 views
package client12// This code is copied from Promtail. The client package is used to configure3// and run the clients that can send log entries to a Loki instance.45import (6"fmt"7"os"8"runtime"9"sync"10"text/tabwriter"1112"github.com/fatih/color"13"github.com/go-kit/log"14"github.com/grafana/agent/component/common/loki"15"gopkg.in/yaml.v2"16)1718var (19yellow = color.New(color.FgYellow)20blue = color.New(color.FgBlue)21)2223func init() {24if runtime.GOOS == "windows" {25yellow.DisableColor()26blue.DisableColor()27}28}2930type logger struct {31*tabwriter.Writer32sync.Mutex33entries chan loki.Entry3435once sync.Once36}3738// NewLogger creates a new client logger that logs entries instead of sending them.39func NewLogger(metrics *Metrics, streamLogLabels []string, log log.Logger, cfgs ...Config) (Client, error) {40// make sure the clients config is valid41c, err := NewMulti(metrics, streamLogLabels, log, 0, cfgs...)42if err != nil {43return nil, err44}45c.Stop()4647fmt.Println(yellow.Sprint("Clients configured:"))48for _, cfg := range cfgs {49yaml, err := yaml.Marshal(cfg)50if err != nil {51return nil, err52}53fmt.Println("----------------------")54fmt.Println(string(yaml))55}56entries := make(chan loki.Entry)57l := &logger{58Writer: tabwriter.NewWriter(os.Stdout, 0, 8, 0, '\t', 0),59entries: entries,60}61go l.run()62return l, nil63}6465func (l *logger) Stop() {66l.once.Do(func() { close(l.entries) })67}6869func (l *logger) Chan() chan<- loki.Entry {70return l.entries71}7273func (l *logger) run() {74for e := range l.entries {75fmt.Fprint(l.Writer, blue.Sprint(e.Timestamp.Format("2006-01-02T15:04:05.999999999-0700")))76fmt.Fprint(l.Writer, "\t")77fmt.Fprint(l.Writer, yellow.Sprint(e.Labels.String()))78fmt.Fprint(l.Writer, "\t")79fmt.Fprint(l.Writer, e.Line)80fmt.Fprint(l.Writer, "\n")81_ = l.Flush()82}83}84func (l *logger) StopNow() { l.Stop() }8586func (l *logger) Name() string {87return ""88}899091