github.com/wanlay/gorm-dm8@v1.0.5/dmr/zp.go (about)

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