gitee.com/curryzheng/dm@v0.0.1/zq.go (about)

     1  /*
     2   * Copyright (c) 2000-2018, 达梦数据库有限公司.
     3   * All rights reserved.
     4   */
     5  package dm
     6  
     7  import (
     8  	"gitee.com/curryzheng/dm/util"
     9  	"os"
    10  	"strconv"
    11  	"strings"
    12  	"time"
    13  )
    14  
    15  const (
    16  	MAX_FILE_SIZE = 100 * 1024 * 1024
    17  	FLUSH_SIZE    = 32 * 1024
    18  )
    19  
    20  type goRun interface {
    21  	doRun()
    22  }
    23  
    24  type logWriter struct {
    25  	flushQueue chan []byte
    26  	date       string
    27  	logFile    *os.File
    28  	flushFreq  int
    29  	filePath   string
    30  	filePrefix string
    31  	buffer     *Dm_build_280
    32  }
    33  
    34  func (lw *logWriter) doRun() {
    35  	defer func() {
    36  		lw.beforeExit()
    37  		lw.closeCurrentFile()
    38  	}()
    39  
    40  	i := 0
    41  	for {
    42  		var ibytes []byte
    43  
    44  		select {
    45  		case ibytes = <-lw.flushQueue:
    46  			if LogLevel != LOG_OFF {
    47  				if i == LogFlushQueueSize {
    48  					lw.doFlush(lw.buffer)
    49  					i = 0
    50  				} else {
    51  					lw.buffer.Dm_build_306(ibytes, 0, len(ibytes))
    52  					i++
    53  				}
    54  			}
    55  		case <-time.After(time.Duration(LogFlushFreq) * time.Millisecond):
    56  			if LogLevel != LOG_OFF && lw.buffer.Dm_build_285() > 0 {
    57  				lw.doFlush(lw.buffer)
    58  				i = 0
    59  			}
    60  
    61  		}
    62  
    63  	}
    64  }
    65  
    66  func (lw *logWriter) doFlush(buffer *Dm_build_280) {
    67  	if lw.needCreateNewFile() {
    68  		lw.closeCurrentFile()
    69  		lw.logFile = lw.createNewFile()
    70  	}
    71  	buffer.Dm_build_300(lw.logFile, buffer.Dm_build_285())
    72  }
    73  func (lw *logWriter) closeCurrentFile() {
    74  	if lw.logFile != nil {
    75  		lw.logFile.Close()
    76  		lw.logFile = nil
    77  	}
    78  }
    79  func (lw *logWriter) createNewFile() *os.File {
    80  	lw.date = time.Now().Format("2006-01-02")
    81  	fileName := lw.filePrefix + "_" + lw.date + "_" + strconv.Itoa(time.Now().Nanosecond()) + ".log"
    82  	lw.filePath = LogDir
    83  	if len(lw.filePath) > 0 {
    84  		if _, err := os.Stat(lw.filePath); err != nil {
    85  			os.MkdirAll(lw.filePath, 0755)
    86  		}
    87  		if _, err := os.Stat(lw.filePath + fileName); err != nil {
    88  			logFile, err := os.Create(lw.filePath + fileName)
    89  			if err != nil {
    90  				panic(err)
    91  			}
    92  			return logFile
    93  		}
    94  	}
    95  	return nil
    96  }
    97  func (lw *logWriter) needCreateNewFile() bool {
    98  	now := time.Now().Format("2006-01-02")
    99  	fileInfo, err := lw.logFile.Stat()
   100  	return now != lw.date || err != nil || lw.logFile == nil || fileInfo.Size() > int64(MAX_FILE_SIZE)
   101  }
   102  func (lw *logWriter) beforeExit() {
   103  	close(lw.flushQueue)
   104  	var ibytes []byte
   105  	for ibytes = <-lw.flushQueue; ibytes != nil; ibytes = <-lw.flushQueue {
   106  		lw.buffer.Dm_build_306(ibytes, 0, len(ibytes))
   107  		if lw.buffer.Dm_build_285() >= LogBufferSize {
   108  			lw.doFlush(lw.buffer)
   109  		}
   110  	}
   111  	if lw.buffer.Dm_build_285() > 0 {
   112  		lw.doFlush(lw.buffer)
   113  	}
   114  }
   115  
   116  func (lw *logWriter) WriteLine(msg string) {
   117  	var b = []byte(strings.TrimSpace(msg) + util.LINE_SEPARATOR)
   118  	lw.flushQueue <- b
   119  }