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 }