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 }