func (l *StdoutLogger) Debug(arguments ...interface{}) {
	l.Println(append([]interface{}{"[DEBUG]"}, arguments...)...)
}
Debug writes an debug message.
package chart
import (
	"fmt"
	"io"
	"os"
	"time"
)
var (
	_ Logger = (*StdoutLogger)(nil)
)
func NewLogger(options ...LoggerOption) Logger {
	stl := &StdoutLogger{
		TimeFormat: time.RFC3339Nano,
		Stdout:     os.Stdout,
		Stderr:     os.Stderr,
	}
	for _, option := range options {
		option(stl)
	}
	return stl
}
type Logger interface {
	Info(...interface{})
	Infof(string, ...interface{})
	Debug(...interface{})
	Debugf(string, ...interface{})
	Err(error)
	FatalErr(error)
	Error(...interface{})
	Errorf(string, ...interface{})
}
func Info(log Logger, arguments ...interface{}) {
	if log == nil {
		return
	}
	log.Info(arguments...)
}
func Infof(log Logger, format string, arguments ...interface{}) {
	if log == nil {
		return
	}
	log.Infof(format, arguments...)
}
func Debug(log Logger, arguments ...interface{}) {
	if log == nil {
		return
	}
	log.Debug(arguments...)
}
func Debugf(log Logger, format string, arguments ...interface{}) {
	if log == nil {
		return
	}
	log.Debugf(format, arguments...)
}
type LoggerOption = func(*StdoutLogger)
func OptLoggerStdout(wr io.Writer) LoggerOption {
	return func(stl *StdoutLogger) {
		stl.Stdout = wr
	}
}
func OptLoggerStderr(wr io.Writer) LoggerOption {
	return func(stl *StdoutLogger) {
		stl.Stderr = wr
	}
}
type StdoutLogger struct {
	TimeFormat string
	Stdout     io.Writer
	Stderr     io.Writer
}
func (l *StdoutLogger) Info(arguments ...interface{}) {
	l.Println(append([]interface{}{"[INFO]"}, arguments...)...)
}
func (l *StdoutLogger) Infof(format string, arguments ...interface{}) {
	l.Println(append([]interface{}{"[INFO]"}, fmt.Sprintf(format, arguments...))...)
}