persistence.go
func (mp *MultiLog) OuterLog(level Level, tags ...string) io.Writer {
	if mp.chouter != nil {
		return &outer{
			ch:  mp.chouter,
			buf: make([]byte, 0),
		}
	}
	mp.chclose = make(chan chan struct{})
	mp.chouter = make(chan []byte)
	if len(mp.mp) < 2 {
		return nil
	}
	f := mp.mp[0].GetF()
	logger := f.NewEntry(mp).Tag("outer").EntryLevel(level)
	go func() {
		for {
			select {
			case buf := <-mp.chouter:
				logger.Tag(tags...).Println(string(buf))
			case ch := <-mp.chclose:
				ch <- struct{}{}
				return
			}
		}
	}()
	return &outer{
		ch:  mp.chouter,
		buf: make([]byte, 0),
	}
}
func (mp *MultiLog) OuterLog(level Level, tags ...string) io.Writer {
	if mp.chouter != nil {
		return &outer{
			ch:  mp.chouter,
			buf: make([]byte, 0),
		}
	}
	mp.chclose = make(chan chan struct{})
	mp.chouter = make(chan []byte)
	if len(mp.mp) < 2 {
		return nil
	}
	f := mp.mp[0].GetF()
	logger := f.NewEntry(mp).Tag("outer").EntryLevel(level)
	go func() {
		for {
			select {
			case buf := <-mp.chouter:
				logger.Tag(tags...).Println(string(buf))
			case ch := <-mp.chclose:
				ch <- struct{}{}
				return
			}
		}
	}()
	return &outer{
		ch:  mp.chouter,
		buf: make([]byte, 0),
	}
}
// outerLog is like outers outerLogs but the nem entry is
// created from the first BackLog in the list.