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 }