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, &currentAppenders); 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  }