gitee.com/chunanyong/dm@v1.8.12/zp.go (about)

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