github.com/sereiner/library@v0.0.0-20200518095232-1fa3e640cc5f/log/config.file.go (about) 1 package log 2 3 import ( 4 "encoding/json" 5 "errors" 6 "fmt" 7 "io/ioutil" 8 "os" 9 "path/filepath" 10 "runtime" 11 12 "strings" 13 14 "github.com/sereiner/library/file" 15 ) 16 17 var loggerPath, _ = file.GetAbs("../conf/logger.json") 18 var configAdapter map[string]func() []*Appender 19 var defaultConfigAdapter string 20 21 //register 设置配置文件 22 func register(adapterName string, f func() []*Appender) error { 23 if configAdapter == nil { 24 configAdapter = make(map[string]func() []*Appender) 25 } 26 if _, ok := configAdapter[adapterName]; ok { 27 return fmt.Errorf("adapter(%s) is exist", adapterName) 28 } 29 configAdapter[adapterName] = f 30 defaultConfigAdapter = adapterName 31 return nil 32 } 33 34 func readFromFile() (appenders []*Appender) { 35 var err error 36 appenders, err = read() 37 if err == nil { 38 return 39 } 40 appenders = getDefConfig() 41 // sysLoggerError(err) 42 err = writeToFile(loggerPath, appenders) 43 if err != nil { 44 sysLoggerError(err) 45 } 46 47 return 48 } 49 50 //NewAppender 构建appender 51 func NewAppender(conf string) (appenders []*Appender, err error) { 52 appenders = make([]*Appender, 0, 2) 53 if err = json.Unmarshal([]byte(conf), &appenders); err != nil { 54 err = errors.New("配置文件格式有误,无法序列化") 55 return 56 } 57 return 58 } 59 60 // // TimeClear 定时清理loggermanager时间间隔 61 // var TimeClear = time.Second 62 63 // TimeWriteToFile 定时写入文件时间间隔 64 65 func read() (appenders []*Appender, err error) { 66 currentAppenders := make([]*Appender, 0, 2) 67 if !exists(loggerPath) { 68 err = errors.New("配置文件不存在:" + loggerPath) 69 return 70 } 71 bytes, err := ioutil.ReadFile(loggerPath) 72 if err != nil { 73 err = errors.New("无法读取配置文件") 74 return 75 } 76 if err = json.Unmarshal(bytes, ¤tAppenders); err != nil { 77 err = errors.New("配置文件格式有误,无法序列化") 78 return 79 } 80 if len(currentAppenders) == 0 { 81 return 82 } 83 appenders = make([]*Appender, 0, len(currentAppenders)) 84 for _, v := range currentAppenders { 85 if strings.EqualFold(v.Level, "off") { 86 continue 87 } 88 appenders = append(appenders, v) 89 } 90 return 91 } 92 func writeToFile(loggerPath string, appenders []*Appender) (err error) { 93 defer func() { 94 if r := recover(); r != nil { 95 err = r.(error) 96 } 97 }() 98 99 fwriter, err := file.CreateFile(loggerPath) 100 if err != nil { 101 return 102 } 103 data, err := json.Marshal(appenders) 104 if err != nil { 105 return 106 } 107 _, err = fwriter.Write(data) 108 if err != nil { 109 return 110 } 111 fwriter.Close() 112 //sysLoggerError("已创建日志配置文件:", loggerPath) 113 return 114 } 115 116 func getDefConfig() (appenders []*Appender) { 117 fileAppender := &Appender{Type: "file", Level: SLevel_ALL} 118 fileAppender.Path, _ = file.GetAbs("../logs/%date.log") 119 fileAppender.Layout = "[%datetime.%ms][%l][%session] %content%n" 120 appenders = append(appenders, fileAppender) 121 122 sdtoutAppender := &Appender{Type: "stdout", Level: SLevel_ALL} 123 sdtoutAppender.Layout = "[%datetime.%ms][%l][%session]%content" 124 appenders = append(appenders, sdtoutAppender) 125 126 return 127 } 128 func exists(p string) bool { 129 _, err := os.Stat(p) 130 return err == nil || os.IsExist(err) 131 } 132 func getCaller(index int) string { 133 defer recover() 134 _, file, line, ok := runtime.Caller(index) 135 if ok { 136 return fmt.Sprintf("%s:%d", filepath.Base(file), line) 137 } 138 return "" 139 }