func (mlog *MultiLogger) Outf(format string, v ...interface{}) {
	if len(mlog.outs) == 0 {
		return
	}
	mlog.writeTo(mlog.qout, format, v...)
}
Outf write the formatted string and its values to all output writers.
package mlog
import (
	"bytes"
	"fmt"
	"log"
	"os"
	"runtime/debug"
	"sync"
	"time"
	libbytes "github.com/shuLhan/share/lib/bytes"
)
type MultiLogger struct {
	bufPool    *sync.Pool
	timeFormat string
	prefix     []byte
	outs       map[string]NamedWriter
	errs       map[string]NamedWriter
	qout       chan []byte
	qerr       chan []byte
	qflush     chan bool
	qerrFlush  chan bool
	qoutFlush  chan bool
}
func NewMultiLogger(timeFormat, prefix string, outs, errs []NamedWriter) (mlog *MultiLogger) {
	mlog = &MultiLogger{
		bufPool: &sync.Pool{
			New: func() interface{} {
				return new(bytes.Buffer)
			},
		},
		timeFormat: timeFormat,
		prefix:     []byte(prefix),
		outs:       make(map[string]NamedWriter),
		errs:       make(map[string]NamedWriter),
		qout:       make(chan []byte, 512),
		qerr:       make(chan []byte, 512),
		qerrFlush:  make(chan bool, 1),
		qoutFlush:  make(chan bool, 1),
		qflush:     make(chan bool, 1),
	}
	for _, w := range outs {
		name := w.Name()
		if len(name) == 0 {
			continue
		}
		mlog.outs[name] = w
	}
	for _, w := range errs {
		name := w.Name()
		if len(name) == 0 {
			continue
		}
		mlog.errs[name] = w
	}
	go mlog.processErrorQueue()
	go mlog.processOutputQueue()
	return mlog
}
func (mlog *MultiLogger) Errf(format string, v ...interface{}) {
	if len(mlog.errs) == 0 {
		return
	}
	mlog.writeTo(mlog.qerr, format, v...)
}
func (mlog *MultiLogger) Fatalf(format string, v ...interface{}) {
	mlog.Errf(format, v...)
	mlog.Flush()
	os.Exit(1)
}
func (mlog *MultiLogger) Flush() {
	mlog.qerrFlush <- true
	mlog.qoutFlush <- true
	<-mlog.qflush
	<-mlog.qflush
}