mirror of
				https://github.com/optim-enterprises-bv/vault.git
				synced 2025-11-04 04:28:08 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			159 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			159 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
package pluginutil
 | 
						|
 | 
						|
import (
 | 
						|
	"bytes"
 | 
						|
	"fmt"
 | 
						|
	stdlog "log"
 | 
						|
	"strings"
 | 
						|
 | 
						|
	hclog "github.com/hashicorp/go-hclog"
 | 
						|
	log "github.com/mgutz/logxi/v1"
 | 
						|
)
 | 
						|
 | 
						|
// pluginLogFaker is a wrapper on logxi.Logger that
 | 
						|
// implements hclog.Logger
 | 
						|
type hclogFaker struct {
 | 
						|
	logger log.Logger
 | 
						|
 | 
						|
	name    string
 | 
						|
	implied []interface{}
 | 
						|
}
 | 
						|
 | 
						|
func (f *hclogFaker) buildLog(msg string, args ...interface{}) (string, []interface{}) {
 | 
						|
	if f.name != "" {
 | 
						|
		msg = fmt.Sprintf("%s: %s", f.name, msg)
 | 
						|
	}
 | 
						|
	args = append(f.implied, args...)
 | 
						|
 | 
						|
	return msg, args
 | 
						|
}
 | 
						|
 | 
						|
func (f *hclogFaker) Trace(msg string, args ...interface{}) {
 | 
						|
	msg, args = f.buildLog(msg, args...)
 | 
						|
	f.logger.Trace(msg, args...)
 | 
						|
}
 | 
						|
 | 
						|
func (f *hclogFaker) Debug(msg string, args ...interface{}) {
 | 
						|
	msg, args = f.buildLog(msg, args...)
 | 
						|
	f.logger.Debug(msg, args...)
 | 
						|
}
 | 
						|
 | 
						|
func (f *hclogFaker) Info(msg string, args ...interface{}) {
 | 
						|
	msg, args = f.buildLog(msg, args...)
 | 
						|
	f.logger.Info(msg, args...)
 | 
						|
}
 | 
						|
 | 
						|
func (f *hclogFaker) Warn(msg string, args ...interface{}) {
 | 
						|
	msg, args = f.buildLog(msg, args...)
 | 
						|
	f.logger.Warn(msg, args...)
 | 
						|
}
 | 
						|
 | 
						|
func (f *hclogFaker) Error(msg string, args ...interface{}) {
 | 
						|
	msg, args = f.buildLog(msg, args...)
 | 
						|
	f.logger.Error(msg, args...)
 | 
						|
}
 | 
						|
 | 
						|
func (f *hclogFaker) IsTrace() bool {
 | 
						|
	return f.logger.IsTrace()
 | 
						|
}
 | 
						|
 | 
						|
func (f *hclogFaker) IsDebug() bool {
 | 
						|
	return f.logger.IsDebug()
 | 
						|
}
 | 
						|
 | 
						|
func (f *hclogFaker) IsInfo() bool {
 | 
						|
	return f.logger.IsInfo()
 | 
						|
}
 | 
						|
 | 
						|
func (f *hclogFaker) IsWarn() bool {
 | 
						|
	return f.logger.IsWarn()
 | 
						|
}
 | 
						|
 | 
						|
func (f *hclogFaker) IsError() bool {
 | 
						|
	return !f.logger.IsTrace() && !f.logger.IsDebug() && !f.logger.IsInfo() && !f.IsWarn()
 | 
						|
}
 | 
						|
 | 
						|
func (f *hclogFaker) With(args ...interface{}) hclog.Logger {
 | 
						|
	var nf = *f
 | 
						|
	nf.implied = append(nf.implied, args...)
 | 
						|
	return f
 | 
						|
}
 | 
						|
 | 
						|
func (f *hclogFaker) Named(name string) hclog.Logger {
 | 
						|
	var nf = *f
 | 
						|
	if nf.name != "" {
 | 
						|
		nf.name = nf.name + "." + name
 | 
						|
	}
 | 
						|
	return &nf
 | 
						|
}
 | 
						|
 | 
						|
func (f *hclogFaker) ResetNamed(name string) hclog.Logger {
 | 
						|
	var nf = *f
 | 
						|
	nf.name = name
 | 
						|
	return &nf
 | 
						|
}
 | 
						|
 | 
						|
func (f *hclogFaker) StandardLogger(opts *hclog.StandardLoggerOptions) *stdlog.Logger {
 | 
						|
	if opts == nil {
 | 
						|
		opts = &hclog.StandardLoggerOptions{}
 | 
						|
	}
 | 
						|
 | 
						|
	return stdlog.New(&stdlogAdapter{f, opts.InferLevels}, "", 0)
 | 
						|
}
 | 
						|
 | 
						|
// Provides a io.Writer to shim the data out of *log.Logger
 | 
						|
// and back into our Logger. This is basically the only way to
 | 
						|
// build upon *log.Logger.
 | 
						|
type stdlogAdapter struct {
 | 
						|
	hl          hclog.Logger
 | 
						|
	inferLevels bool
 | 
						|
}
 | 
						|
 | 
						|
// Take the data, infer the levels if configured, and send it through
 | 
						|
// a regular Logger
 | 
						|
func (s *stdlogAdapter) Write(data []byte) (int, error) {
 | 
						|
	str := string(bytes.TrimRight(data, " \t\n"))
 | 
						|
 | 
						|
	if s.inferLevels {
 | 
						|
		level, str := s.pickLevel(str)
 | 
						|
		switch level {
 | 
						|
		case hclog.Trace:
 | 
						|
			s.hl.Trace(str)
 | 
						|
		case hclog.Debug:
 | 
						|
			s.hl.Debug(str)
 | 
						|
		case hclog.Info:
 | 
						|
			s.hl.Info(str)
 | 
						|
		case hclog.Warn:
 | 
						|
			s.hl.Warn(str)
 | 
						|
		case hclog.Error:
 | 
						|
			s.hl.Error(str)
 | 
						|
		default:
 | 
						|
			s.hl.Info(str)
 | 
						|
		}
 | 
						|
	} else {
 | 
						|
		s.hl.Info(str)
 | 
						|
	}
 | 
						|
 | 
						|
	return len(data), nil
 | 
						|
}
 | 
						|
 | 
						|
// Detect, based on conventions, what log level this is
 | 
						|
func (s *stdlogAdapter) pickLevel(str string) (hclog.Level, string) {
 | 
						|
	switch {
 | 
						|
	case strings.HasPrefix(str, "[DEBUG]"):
 | 
						|
		return hclog.Debug, strings.TrimSpace(str[7:])
 | 
						|
	case strings.HasPrefix(str, "[TRACE]"):
 | 
						|
		return hclog.Trace, strings.TrimSpace(str[7:])
 | 
						|
	case strings.HasPrefix(str, "[INFO]"):
 | 
						|
		return hclog.Info, strings.TrimSpace(str[6:])
 | 
						|
	case strings.HasPrefix(str, "[WARN]"):
 | 
						|
		return hclog.Warn, strings.TrimSpace(str[7:])
 | 
						|
	case strings.HasPrefix(str, "[ERROR]"):
 | 
						|
		return hclog.Error, strings.TrimSpace(str[7:])
 | 
						|
	case strings.HasPrefix(str, "[ERR]"):
 | 
						|
		return hclog.Error, strings.TrimSpace(str[5:])
 | 
						|
	default:
 | 
						|
		return hclog.Info, str
 | 
						|
	}
 | 
						|
}
 |