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  }