func (l *Logger) Counter(title string) {
	l.CounterD(title, 1, M{})  
}
Counter takes a string and logs with LogLevel = Info, type = counter, and value = 1
package logger
import (
	"io"
	"log"
	"os"
	"strings"
	kv "gopkg.in/Clever/kayvee-go.v3"
)
type Formatter func(data map[string]interface{}) string
type LogLevel int
type M map[string]interface{}
const (
	Debug LogLevel = iota
	Info
	Warning
	Error
	Critical
)
var reservedKeyNames = map[string]bool{
	"title":  true,
	"source": true,
	"value":  true,
	"type":   true,
}
var logLevelNames = map[LogLevel]string{
	Debug:    "debug",
	Info:     "info",
	Warning:  "warning",
	Error:    "error",
	Critical: "critical",
}
func (l LogLevel) String() string {
	switch l {
	case Debug:
		fallthrough
	case Info:
		fallthrough
	case Warning:
		fallthrough
	case Error:
		fallthrough
	case Critical:
		return logLevelNames[l]
	}
	return ""
}
type Logger struct {
	globals   map[string]interface{}
	logLvl    LogLevel
	formatter Formatter
	logWriter *log.Logger
}
func (l *Logger) SetConfig(source string, logLvl LogLevel, formatter Formatter, output io.Writer) {
	if l.globals == nil {
		l.globals = make(map[string]interface{})
	}
	l.globals["source"] = source
	l.logLvl = logLvl
	l.formatter = formatter
	l.logWriter = log.New(output, "", 0)  
}
func (l *Logger) SetLogLevel(logLvl LogLevel) {
	l.logLvl = logLvl
}
func (l *Logger) SetFormatter(formatter Formatter) {
	l.formatter = formatter
}
func (l *Logger) SetOutput(output io.Writer) {
	l.logWriter = log.New(output, "", 0)  
}
func (l *Logger) Debug(title string) {
	l.DebugD(title, M{})
}
func (l *Logger) Info(title string) {
	l.InfoD(title, M{})
}
func (l *Logger) Warn(title string) {
	l.WarnD(title, M{})
}
func (l *Logger) Error(title string) {
	l.ErrorD(title, M{})
}
func (l *Logger) Critical(title string) {
	l.CriticalD(title, M{})
}