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  }