func NewListLogHandler(h1, h2 LogHandler) *ListLogHandler {
	ll := &ListLogHandler{handlers: []LogHandler{h1, h2}}
	return ll
}
Create a new list of log handlers
package logger
import (
	"fmt"
	"io"
)
type LevelFilterHandler struct {
	Level LogLevel
	h     LogHandler
}
func LevelHandler(lvl LogLevel, h LogHandler) LogHandler {
	return &LevelFilterHandler{lvl, h}
}
func (h LevelFilterHandler) Log(r *Record) error {
	if r.Level == h.Level {
		return h.h.Log(r)
	}
	return nil
}
func MinLevelHandler(lvl LogLevel, h LogHandler) LogHandler {
	return FilterHandler(func(r *Record) (pass bool) {
		return r.Level <= lvl
	}, h)
}
func NotLevelHandler(lvl LogLevel, h LogHandler) LogHandler {
	return FilterHandler(func(r *Record) (pass bool) {
		return r.Level != lvl
	}, h)
}
func CallerFileHandler(h LogHandler) LogHandler {
	return FuncHandler(func(r *Record) error {
		r.Context.Add("caller", fmt.Sprint(r.Call))
		return h.Log(r)
	})
}
func CallerFuncHandler(h LogHandler) LogHandler {
	return CallerFuncHandler(h)
}
func MatchHandler(key string, value interface{}, h LogHandler) LogHandler {
	return MatchFilterHandler(key, value, h)
}
func MatchFilterHandler(key string, value interface{}, h LogHandler) LogHandler {
	return FilterHandler(func(r *Record) (pass bool) {
		return r.Context[key] == value
	}, h)
}
func MatchAbHandler(key string, value interface{}, a, b LogHandler) LogHandler {
	return FuncHandler(func(r *Record) error {
		if r.Context[key] == value {
			return a.Log(r)
		} else if b != nil {
			return b.Log(r)
		}
		return nil
	})
}
func NilHandler() LogHandler {
	return FuncHandler(func(r *Record) error {
		return nil
	})
}
func MatchMapHandler(matchMap map[string]interface{}, a LogHandler) LogHandler {
	return matchMapHandler(matchMap, false, a)
}
func NotMatchMapHandler(matchMap map[string]interface{}, a LogHandler) LogHandler {
	return matchMapHandler(matchMap, true, a)
}
func matchMapHandler(matchMap map[string]interface{}, inverse bool, a LogHandler) LogHandler {
	return FuncHandler(func(r *Record) error {
		matchCount := 0
		for k, v := range matchMap {
			value, found := r.Context[k]
			if !found {
				return nil
			}
			if value == v && inverse || value != v && !inverse {
				return nil
			} else {
				matchCount++
			}
		}
		if matchCount != len(matchMap) {
			return nil
		}
		return a.Log(r)
	})
}
func NotMatchHandler(key string, value interface{}, h LogHandler) LogHandler {
	return FilterHandler(func(r *Record) (pass bool) {
		return r.Context[key] != value
	}, h)
}
func MultiHandler(hs ...LogHandler) LogHandler {
	return FuncHandler(func(r *Record) error {
		for _, h := range hs {
			h.Log(r)
		}
		return nil
	})
}
func StreamHandler(wr io.Writer, fmtr LogFormat) LogHandler {
	h := FuncHandler(func(r *Record) error {
		_, err := wr.Write(fmtr.Format(r))
		return err
	})
	return LazyHandler(SyncHandler(h))
}
func FilterHandler(fn func(r *Record) bool, h LogHandler) LogHandler {
	return FuncHandler(func(r *Record) error {
		if fn(r) {
			return h.Log(r)
		}
		return nil
	})
}
type ListLogHandler struct {
	handlers []LogHandler
}