|
|
|
package icslog
|
|
|
|
|
|
|
|
import (
|
|
|
|
"fmt"
|
|
|
|
"os"
|
|
|
|
"path/filepath"
|
|
|
|
"runtime"
|
|
|
|
"strconv"
|
|
|
|
"strings"
|
|
|
|
|
|
|
|
"gitlab.com/ics_cinnamon/voiceStatistics/icserror"
|
|
|
|
"gitlab.com/ics_cinnamon/voiceStatistics/icsutil"
|
|
|
|
)
|
|
|
|
|
|
|
|
const (
|
|
|
|
ONEMB = 1048576
|
|
|
|
)
|
|
|
|
|
|
|
|
func (l *IcsLog) Printf(level int, sessionID int, format string, a ...interface{}) {
|
|
|
|
msg := fmt.Sprintf(format, a...)
|
|
|
|
|
|
|
|
if level >= l.Level {
|
|
|
|
//check disk full
|
|
|
|
aSpace := icsutil.GetDiskAvailableSpace(filepath.Dir(l.LogFileName))
|
|
|
|
if aSpace < uint64(l.conf.Disklimit*ONEMB) {
|
|
|
|
//if aSpace < uint64(l.conf.LogConfig.Disklimit*ONEMB) {
|
|
|
|
if !l.IsDiskFull {
|
|
|
|
msg = fmt.Sprintf("Disk Full! Available Disk Space: %dMB", aSpace/ONEMB)
|
|
|
|
l.logger.Output(2, msg)
|
|
|
|
if l.LogFile != nil {
|
|
|
|
l.LogFile.WriteString(l.buf.String())
|
|
|
|
}
|
|
|
|
l.buf.Reset()
|
|
|
|
l.IsDiskFull = true
|
|
|
|
}
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
l.M.Lock()
|
|
|
|
|
|
|
|
if l.checkLogRotate() {
|
|
|
|
//check log size
|
|
|
|
stat, err := os.Stat(l.LogFileName)
|
|
|
|
if err != nil {
|
|
|
|
msg = fmt.Sprintf("Could not get log file(%s) size", l.LogFileName)
|
|
|
|
l.logger.Output(2, msg)
|
|
|
|
if l.LogFile != nil {
|
|
|
|
l.LogFile.WriteString(l.buf.String())
|
|
|
|
}
|
|
|
|
l.buf.Reset()
|
|
|
|
|
|
|
|
l.M.Unlock()
|
|
|
|
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
if stat.Size()/ONEMB >= int64(l.logSize) {
|
|
|
|
//shift log files
|
|
|
|
rotateNum := gIcsLog.getTodayLogFileNum()
|
|
|
|
if rotateNum > 0 && rotateNum < gIcsLog.rotateNum {
|
|
|
|
gIcsLog.shiftLogFiles(rotateNum)
|
|
|
|
|
|
|
|
l.LogFile.Sync()
|
|
|
|
l.LogFile.Close()
|
|
|
|
|
|
|
|
//open new log file
|
|
|
|
var oerr error
|
|
|
|
//fmt.Println("LOG rotate new log file", l.LogFileName)
|
|
|
|
l.LogFile, oerr = os.OpenFile(l.LogFileName, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666)
|
|
|
|
if oerr != nil {
|
|
|
|
icserror.ICSERRFileOpen.SetError(oerr)
|
|
|
|
icserror.ICSERRFileOpen.PrintWithCaller(1)
|
|
|
|
|
|
|
|
l.M.Unlock()
|
|
|
|
return
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
l.M.Unlock()
|
|
|
|
return
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
//write log
|
|
|
|
if level < LOG_LEVEL_DEBUG2 || level > LOG_LEVEL_FATAL {
|
|
|
|
level = LOG_LEVEL_INFO
|
|
|
|
}
|
|
|
|
var logmsg string
|
|
|
|
if sessionID >= 0 {
|
|
|
|
logmsg = fmt.Sprintf("%s", msg)
|
|
|
|
} else {
|
|
|
|
logmsg = fmt.Sprintf("%s", msg)
|
|
|
|
}
|
|
|
|
|
|
|
|
l.logger.Output(2, logmsg)
|
|
|
|
if l.LogFile != nil {
|
|
|
|
l.LogFile.WriteString(l.buf.String())
|
|
|
|
}
|
|
|
|
l.buf.Reset()
|
|
|
|
|
|
|
|
l.M.Unlock()
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
func (l *IcsLog) Print(level int, sessionID int, msg string) {
|
|
|
|
if level >= l.Level {
|
|
|
|
//check disk full
|
|
|
|
aSpace := icsutil.GetDiskAvailableSpace(filepath.Dir(l.LogFileName))
|
|
|
|
if aSpace < uint64(l.conf.Disklimit*ONEMB) {
|
|
|
|
//if aSpace < uint64(l.conf.LogConfig.Disklimit*ONEMB) {
|
|
|
|
if !l.IsDiskFull {
|
|
|
|
msg = fmt.Sprintf("Disk Full! Available Disk Space: %dMB", aSpace/ONEMB)
|
|
|
|
l.logger.Output(2, msg)
|
|
|
|
if l.LogFile != nil {
|
|
|
|
l.LogFile.WriteString(l.buf.String())
|
|
|
|
}
|
|
|
|
l.buf.Reset()
|
|
|
|
l.IsDiskFull = true
|
|
|
|
}
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
l.M.Lock()
|
|
|
|
|
|
|
|
if l.checkLogRotate() {
|
|
|
|
//check log size
|
|
|
|
stat, err := os.Stat(l.LogFileName)
|
|
|
|
if err != nil {
|
|
|
|
msg = fmt.Sprintf("Could not get log file(%s) size", l.LogFileName)
|
|
|
|
l.logger.Output(2, msg)
|
|
|
|
if l.LogFile != nil {
|
|
|
|
l.LogFile.WriteString(l.buf.String())
|
|
|
|
}
|
|
|
|
l.buf.Reset()
|
|
|
|
|
|
|
|
l.M.Unlock()
|
|
|
|
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
if stat.Size()/ONEMB >= int64(l.logSize) {
|
|
|
|
//shift log files
|
|
|
|
rotateNum := gIcsLog.getTodayLogFileNum()
|
|
|
|
//fmt.Println("rotate num:", rotateNum, "log size:", stat.Size()/ONEMB, l.logSize)
|
|
|
|
if rotateNum > 0 && rotateNum < gIcsLog.rotateNum {
|
|
|
|
gIcsLog.shiftLogFiles(rotateNum)
|
|
|
|
|
|
|
|
l.LogFile.Sync()
|
|
|
|
l.LogFile.Close()
|
|
|
|
|
|
|
|
//open new log file
|
|
|
|
var oerr error
|
|
|
|
l.LogFile, oerr = os.OpenFile(l.LogFileName, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666)
|
|
|
|
if oerr != nil {
|
|
|
|
icserror.ICSERRFileOpen.SetError(oerr)
|
|
|
|
icserror.ICSERRFileOpen.PrintWithCaller(1)
|
|
|
|
|
|
|
|
l.M.Unlock()
|
|
|
|
return
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
l.M.Unlock()
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
//write log
|
|
|
|
if level < LOG_LEVEL_DEBUG2 || level > LOG_LEVEL_FATAL {
|
|
|
|
level = LOG_LEVEL_INFO
|
|
|
|
}
|
|
|
|
var logmsg string
|
|
|
|
if sessionID >= 0 {
|
|
|
|
logmsg = fmt.Sprintf("%s", msg)
|
|
|
|
} else {
|
|
|
|
logmsg = fmt.Sprintf("%s", msg)
|
|
|
|
}
|
|
|
|
l.logger.Output(2, logmsg)
|
|
|
|
if l.LogFile != nil {
|
|
|
|
l.LogFile.WriteString(l.buf.String())
|
|
|
|
}
|
|
|
|
l.buf.Reset()
|
|
|
|
|
|
|
|
l.M.Unlock()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func goid() int {
|
|
|
|
var buf [64]byte
|
|
|
|
n := runtime.Stack(buf[:], false)
|
|
|
|
idField := strings.Fields(strings.TrimPrefix(string(buf[:n]), "goroutine "))[0]
|
|
|
|
id, err := strconv.Atoi(idField)
|
|
|
|
if err != nil {
|
|
|
|
return -1
|
|
|
|
}
|
|
|
|
return id
|
|
|
|
}
|