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