90 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			90 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| // Copyright 2020
 | ||
| //
 | ||
| // Licensed under the Apache License, Version 2.0 (the "License");
 | ||
| // you may not use this file except in compliance with the License.
 | ||
| // You may obtain a copy of the License at
 | ||
| //
 | ||
| // http://www.apache.org/licenses/LICENSE-2.0
 | ||
| //
 | ||
| // Unless required by applicable law or agreed to in writing, software
 | ||
| // distributed under the License is distributed on an "AS IS" BASIS,
 | ||
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | ||
| // See the License for the specific language governing permissions and
 | ||
| // limitations under the License.
 | ||
| 
 | ||
| package logs
 | ||
| 
 | ||
| import (
 | ||
| 	"path"
 | ||
| 	"strconv"
 | ||
| )
 | ||
| 
 | ||
| var formatterMap = make(map[string]LogFormatter, 4)
 | ||
| 
 | ||
| type LogFormatter interface {
 | ||
| 	Format(lm *LogMsg) string
 | ||
| }
 | ||
| 
 | ||
| // PatternLogFormatter provides a quick format method
 | ||
| // for example:
 | ||
| // tes := &PatternLogFormatter{Pattern: "%F:%n|%w %t>> %m", WhenFormat: "2006-01-02"}
 | ||
| // RegisterFormatter("tes", tes)
 | ||
| // SetGlobalFormatter("tes")
 | ||
| type PatternLogFormatter struct {
 | ||
| 	Pattern    string
 | ||
| 	WhenFormat string
 | ||
| }
 | ||
| 
 | ||
| func (p *PatternLogFormatter) getWhenFormatter() string {
 | ||
| 	s := p.WhenFormat
 | ||
| 	if s == "" {
 | ||
| 		s = "2006/01/02 15:04:05.123" // default style
 | ||
| 	}
 | ||
| 	return s
 | ||
| }
 | ||
| 
 | ||
| func (p *PatternLogFormatter) Format(lm *LogMsg) string {
 | ||
| 	return p.ToString(lm)
 | ||
| }
 | ||
| 
 | ||
| // RegisterFormatter register an formatter. Usually you should use this to extend your custom formatter
 | ||
| // for example:
 | ||
| // RegisterFormatter("my-fmt", &MyFormatter{})
 | ||
| // logs.SetFormatter(Console, `{"formatter": "my-fmt"}`)
 | ||
| func RegisterFormatter(name string, fmtr LogFormatter) {
 | ||
| 	formatterMap[name] = fmtr
 | ||
| }
 | ||
| 
 | ||
| func GetFormatter(name string) (LogFormatter, bool) {
 | ||
| 	res, ok := formatterMap[name]
 | ||
| 	return res, ok
 | ||
| }
 | ||
| 
 | ||
| // 'w' when, 'm' msg,'f' filename,'F' full path,'n' line number
 | ||
| // 'l' level number, 't' prefix of level type, 'T' full name of level type
 | ||
| func (p *PatternLogFormatter) ToString(lm *LogMsg) string {
 | ||
| 	s := []rune(p.Pattern)
 | ||
| 	m := map[rune]string{
 | ||
| 		'w': lm.When.Format(p.getWhenFormatter()),
 | ||
| 		'm': lm.Msg,
 | ||
| 		'n': strconv.Itoa(lm.LineNumber),
 | ||
| 		'l': strconv.Itoa(lm.Level),
 | ||
| 		't': levelPrefix[lm.Level],
 | ||
| 		'T': levelNames[lm.Level],
 | ||
| 		'F': lm.FilePath,
 | ||
| 	}
 | ||
| 	_, m['f'] = path.Split(lm.FilePath)
 | ||
| 	res := ""
 | ||
| 	for i := 0; i < len(s)-1; i++ {
 | ||
| 		if s[i] == '%' {
 | ||
| 			if k, ok := m[s[i+1]]; ok {
 | ||
| 				res += k
 | ||
| 				i++
 | ||
| 				continue
 | ||
| 			}
 | ||
| 		}
 | ||
| 		res += string(s[i])
 | ||
| 	}
 | ||
| 	return res
 | ||
| }
 |