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  }