github.com/sereiner/library@v0.0.0-20200518095232-1fa3e640cc5f/log/logger.go (about) 1 package log 2 3 import ( 4 "fmt" 5 "sync" 6 "sync/atomic" 7 "time" 8 9 "bytes" 10 11 "github.com/sereiner/library/utility" 12 ) 13 14 //Logger 日志对象 15 type Logger struct { 16 index int64 17 names string 18 sessions string 19 tags map[string]string 20 isPause bool 21 DoPrint func(content ...interface{}) 22 DoPrintf func(format string, content ...interface{}) 23 } 24 25 var loggerEventChan chan *LogEvent 26 var loggerCloserChan chan *Logger 27 var loggerPool *sync.Pool 28 var manager *loggerManager 29 var closeChan chan struct{} 30 var onceClose sync.Once 31 var done bool 32 33 func init() { 34 loggerPool = &sync.Pool{ 35 New: func() interface{} { 36 return New("") 37 }, 38 } 39 // 设置配置文件 40 register(appender_file, readFromFile) 41 var err error 42 manager, err = newLoggerManager() 43 if err != nil { 44 fmt.Println("logger err:未启用日志") 45 return 46 } 47 closeChan = make(chan struct{}) 48 loggerEventChan = make(chan *LogEvent, 2000) 49 loggerCloserChan = make(chan *Logger, 1000) 50 go logNow() 51 52 } 53 54 //AddWriteThread 添加count个写线程用于并发写日志 55 func AddWriteThread(count int) { 56 for i := 0; i < count; i++ { 57 go logNow() 58 } 59 } 60 61 //ResetConfig 重置日志配置 62 func ResetConfig(conf string) (err error) { 63 apds, err := NewAppender(conf) 64 if err != nil { 65 return err 66 } 67 manager.configs = apds 68 return nil 69 } 70 71 //New 根据一个或多个日志名称构建日志对象,该日志对象具有新的session id系统不会缓存该日志组件 72 func New(names string) (logger *Logger) { 73 logger = &Logger{index: 100} 74 logger.names = names 75 logger.sessions = CreateSession() 76 logger.DoPrint = logger.Info 77 logger.DoPrintf = logger.Infof 78 return logger 79 } 80 81 //GetSession 根据日志名称及session获取日志组件 82 func GetSession(name string, sessionID string, tags ...string) (logger *Logger) { 83 logger = loggerPool.Get().(*Logger) 84 logger.names = name 85 logger.sessions = sessionID 86 logger.tags = make(map[string]string) 87 if len(tags) > 0 && len(tags) != 2 { 88 panic(fmt.Sprintf("日志输入参数错误,扩展参数必须成对出现:%s,%v", name, tags)) 89 } 90 for i := 0; i < len(tags)-1; i++ { 91 logger.tags[tags[i]] = tags[i+1] 92 } 93 return logger 94 } 95 96 //Close 关闭当前日志组件 97 func (logger *Logger) Close() { 98 select { 99 case loggerCloserChan <- logger: 100 default: 101 loggerPool.Put(logger) 102 } 103 } 104 105 //PauseLogging 暂停记录 106 func (logger *Logger) PauseLogging() { 107 logger.isPause = true 108 } 109 110 //StartLogging 启动记录 111 func (logger *Logger) StartLogging() { 112 logger.isPause = false 113 } 114 115 //SetTag 设置tag 116 func (logger *Logger) SetTag(name string, value string) { 117 logger.tags[name] = value 118 } 119 120 //GetSessionID 获取当前日志的session id 121 func (logger *Logger) GetSessionID() string { 122 if len(logger.sessions) > 0 { 123 return logger.sessions 124 } 125 return "" 126 } 127 128 //Debug 输出debug日志 129 func (logger *Logger) Debug(content ...interface{}) { 130 if !isOpen || logger.isPause { 131 return 132 } 133 logger.log(SLevel_Debug, content...) 134 } 135 136 //Debugf 输出debug日志 137 func (logger *Logger) Debugf(format string, content ...interface{}) { 138 if !isOpen || logger.isPause { 139 return 140 } 141 logger.logfmt(format, SLevel_Debug, content...) 142 } 143 144 //Info 输出info日志 145 func (logger *Logger) Info(content ...interface{}) { 146 if !isOpen || logger.isPause { 147 return 148 } 149 logger.log(SLevel_Info, content...) 150 } 151 152 //Infof 输出info日志 153 func (logger *Logger) Infof(format string, content ...interface{}) { 154 if !isOpen || logger.isPause { 155 return 156 } 157 logger.logfmt(format, SLevel_Info, content...) 158 } 159 160 //Warn 输出info日志 161 func (logger *Logger) Warn(content ...interface{}) { 162 if !isOpen || logger.isPause { 163 return 164 } 165 logger.log(SLevel_Warn, content...) 166 } 167 168 //Warnf 输出info日志 169 func (logger *Logger) Warnf(format string, content ...interface{}) { 170 if !isOpen || logger.isPause { 171 return 172 } 173 logger.logfmt(format, SLevel_Warn, content...) 174 } 175 176 //Error 输出Error日志 177 func (logger *Logger) Error(content ...interface{}) { 178 if !isOpen || logger.isPause { 179 return 180 } 181 logger.log(SLevel_Error, content...) 182 } 183 184 //Errorf 输出Errorf日志 185 func (logger *Logger) Errorf(format string, content ...interface{}) { 186 if !isOpen || logger.isPause { 187 return 188 } 189 logger.logfmt(format, SLevel_Error, content...) 190 } 191 192 //Fatal 输出Fatal日志 193 func (logger *Logger) Fatal(content ...interface{}) { 194 if !isOpen || logger.isPause { 195 return 196 } 197 logger.log(SLevel_Fatal, content...) 198 } 199 200 //Fatalf 输出Fatalf日志 201 func (logger *Logger) Fatalf(format string, content ...interface{}) { 202 if !isOpen || logger.isPause { 203 return 204 } 205 logger.logfmt(format, SLevel_Fatal, content...) 206 207 } 208 209 //Fatalln 输出Fatal日志 210 func (logger *Logger) Fatalln(content ...interface{}) { 211 logger.Fatal(content...) 212 } 213 214 //Print 输出info日志 215 func (logger *Logger) Print(content ...interface{}) { 216 if logger.DoPrint == nil { 217 return 218 } 219 logger.DoPrint(content...) 220 } 221 222 //Printf 输出info日志 223 func (logger *Logger) Printf(format string, content ...interface{}) { 224 if logger == nil || logger.DoPrintf == nil { 225 return 226 } 227 logger.DoPrintf(format, content...) 228 } 229 230 //Println 输出info日志 231 func (logger *Logger) Println(content ...interface{}) { 232 logger.Print(content...) 233 234 } 235 func (logger *Logger) logfmt(f string, level string, content ...interface{}) { 236 event := NewLogEvent(logger.names, level, logger.sessions, fmt.Sprintf(f, content...), nil, atomic.AddInt64(&logger.index, 1)) 237 loggerEventChan <- event 238 } 239 func (logger *Logger) log(level string, content ...interface{}) { 240 event := NewLogEvent(logger.names, level, logger.sessions, getString(content...), nil, atomic.AddInt64(&logger.index, 1)) 241 loggerEventChan <- event 242 } 243 func logNow() { 244 for { 245 select { 246 case logger := <-loggerCloserChan: 247 loggerPool.Put(logger) 248 case v, ok := <-loggerEventChan: 249 if !ok { 250 onceClose.Do(func() { 251 close(closeChan) 252 }) 253 return 254 } 255 manager.Log(v) 256 v.Close() 257 } 258 } 259 } 260 func getString(c ...interface{}) string { 261 if len(c) == 1 { 262 return fmt.Sprintf("%v", c[0]) 263 } 264 var buf bytes.Buffer 265 for i := 0; i < len(c); i++ { 266 buf.WriteString(fmt.Sprint(c[i])) 267 if i != len(c)-1 { 268 buf.WriteString(" ") 269 } 270 } 271 return buf.String() 272 } 273 274 //Close 关闭所有日志组件 275 func Close() { 276 if done { 277 return 278 } 279 isOpen = false 280 done = true 281 time.Sleep(time.Millisecond * 100) 282 if manager == nil { 283 return 284 } 285 close(loggerEventChan) 286 <-closeChan 287 manager.Close() 288 } 289 290 //CreateSession create logger session 291 func CreateSession() string { 292 return utility.GetGUID()[0:9] 293 }