github.com/eframework-cn/EP.GO.UTIL@v1.0.0/xlog/xlog.go (about) 1 //-----------------------------------------------------------------------// 2 // GNU GENERAL PUBLIC LICENSE // 3 // Version 2, June 1991 // 4 // // 5 // Copyright (C) EFramework, https://eframework.cn, All rights reserved. // 6 // Everyone is permitted to copy and distribute verbatim copies // 7 // of this license document, but changing it is not allowed. // 8 // SEE LICENSE.md FOR MORE DETAILS. // 9 //-----------------------------------------------------------------------// 10 11 // 提供了日志打印(分层&异步)、日志保存(分块&异步)等功能. 12 package xlog 13 14 import ( 15 "encoding/json" 16 "fmt" 17 "io/ioutil" 18 "strings" 19 ) 20 21 const ( 22 MAX_CHAN_LEN = 300000 // 通道缓存数量 23 ) 24 25 // 日志配置 26 type LogCfg struct { 27 Filename string `json:"filename,omitempty"` // 日志名称 28 MaxLines int `json:"maxlines,omitempty"` // 最大行数 29 MaxSize int `json:"maxsize,omitempty"` // 最大字节数 30 Daily bool `json:"daily,omitempty"` // 跨日自动保存 31 MaxDays int64 `json:"maxdays,omitempty"` // 最多支持天数 32 Rotate bool `json:"rotate,omitempty"` 33 Level int `json:"level,omitempty"` // 日志层级 34 Perm string `json:"perm,omitempty"` // 文件权限 35 } 36 37 // 初始化 38 // file: 配置文件 39 func Init(file string) *BeeLogger { 40 data, e := ioutil.ReadFile(file) 41 if e != nil { 42 msg := fmt.Sprintf("xlog.Init: file %v load failed, error=%v", file, e) 43 panic(msg) 44 } 45 46 var m map[string]*LogCfg 47 if e := json.Unmarshal(data, &m); e != nil { 48 msg := fmt.Sprintf("xlog.Init: log config invalid, file:%v, error:%v\n", file, e) 49 panic(msg) 50 } 51 52 setLogger := func(name string, cfg *LogCfg) { 53 r, _ := json.Marshal(cfg) 54 e := beeLogger.SetLogger(name, string(r)) 55 if e != nil { 56 fmt.Printf("xlog.Init: set logger failed, error=%v", e) 57 } 58 } 59 60 level := LevelEmergency 61 for k, v := range m { 62 setLogger(k, v) 63 if v.Level > level { 64 level = v.Level 65 } 66 } 67 68 beeLogger.SetLevel(level) 69 70 Async(MAX_CHAN_LEN) 71 72 return beeLogger 73 } 74 75 // 清空缓冲区 76 func Flush() { 77 Emergency("xlog.Flush: GLogger has been flushed") 78 beeLogger.Flush() 79 } 80 81 // 关闭日志服务 82 func Close() { 83 Emergency("xlog.Close: GLogger has been closed") 84 beeLogger.Close() 85 } 86 87 // 缓冲区数量 88 func ChanSize() int { 89 return len(beeLogger.msgChan) 90 } 91 92 // 触发异常(Crash) 93 func Panic(v ...interface{}) { 94 s := fmt.Sprintf(strings.Repeat("%v ", len(v)), v...) 95 panic(s) 96 }