package logging
import (
"io"
"github.com/go-kit/log"
)
type Logger struct {
sink *Sink
parentComponentID string
componentID string
orig log.Logger
log log.Logger
}
func New(sink *Sink, opts ...LoggerOption) *Logger {
if sink == nil {
sink, _ = WriterSink(io.Discard, DefaultSinkOptions)
}
l := &Logger{
sink: sink,
parentComponentID: sink.parentComponentID,
orig: sink.logger,
}
for _, opt := range opts {
opt(l)
}
l.log = wrapWithComponentID(sink.logger, sink.parentComponentID, l.componentID)
return l
}
type LoggerOption func(*Logger)
func WithComponentID(id string) LoggerOption {
return func(l *Logger) {
l.componentID = id
}
}
func (c *Logger) Log(kvps ...interface{}) error {
return c.log.Log(kvps...)
}
func wrapWithComponentID(l log.Logger, parentID, componentID string) log.Logger {
id := fullID(parentID, componentID)
if id == "" {
return l
}
return log.With(l, "component", id)
}
func fullID(parentID, componentID string) string {
switch {
case componentID == "":
return parentID
case parentID == "":
return componentID
default:
return parentID + "/" + componentID
}
}