add skipfunc
This commit is contained in:
parent
8cd13a5663
commit
af595ae6d5
25
log.go
25
log.go
@ -61,6 +61,7 @@ type Logger struct {
|
|||||||
module string
|
module string
|
||||||
golog *log.Logger
|
golog *log.Logger
|
||||||
loglevel LogLevel
|
loglevel LogLevel
|
||||||
|
skipfunc func(string) bool
|
||||||
calldepth int
|
calldepth int
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -108,6 +109,11 @@ func (log *Logger) SetCalldepth(calldepth int) {
|
|||||||
log.calldepth = calldepth
|
log.calldepth = calldepth
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// SetSkipfunc set skip func to skip stack filename
|
||||||
|
func (log *Logger) SetSkipfunc(skipfunc func(string) bool) {
|
||||||
|
log.skipfunc = skipfunc
|
||||||
|
}
|
||||||
|
|
||||||
func (log *Logger) Print(prefix string, v interface{}) {
|
func (log *Logger) Print(prefix string, v interface{}) {
|
||||||
var str = ""
|
var str = ""
|
||||||
if pkg, err := json.Marshal(v); err != nil {
|
if pkg, err := json.Marshal(v); err != nil {
|
||||||
@ -198,7 +204,7 @@ func (log *Logger) logwrite(typ LogLevel, calldepth int, format string, v ...int
|
|||||||
calldepth += log.calldepth
|
calldepth += log.calldepth
|
||||||
var (
|
var (
|
||||||
idstr = log.GetLogidStr(" [%s]")
|
idstr = log.GetLogidStr(" [%s]")
|
||||||
header = formatHeader(calldepth) + "$" + idstr
|
header = formatHeader(calldepth, log.skipfunc) + "$" + idstr
|
||||||
)
|
)
|
||||||
|
|
||||||
format = strings.Trim(format, "\n")
|
format = strings.Trim(format, "\n")
|
||||||
@ -238,7 +244,7 @@ func (log *Logger) logwrite(typ LogLevel, calldepth int, format string, v ...int
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func formatHeader(calldepth int) string {
|
func formatHeader(calldepth int, skipfunc func(string) bool) string {
|
||||||
const MAX_LENGTH = 35 /* + 22 */
|
const MAX_LENGTH = 35 /* + 22 */
|
||||||
// log time
|
// log time
|
||||||
now := time.Now()
|
now := time.Now()
|
||||||
@ -248,10 +254,17 @@ func formatHeader(calldepth int) string {
|
|||||||
year, month, day, hour, min, sec, now.Nanosecond()/1e6)
|
year, month, day, hour, min, sec, now.Nanosecond()/1e6)
|
||||||
|
|
||||||
// log position
|
// log position
|
||||||
_, file, line, ok := runtime.Caller(calldepth)
|
pcs := [13]uintptr{}
|
||||||
if !ok {
|
cnt := runtime.Callers(calldepth+1, pcs[:])
|
||||||
file = "???"
|
frames := runtime.CallersFrames(pcs[:cnt])
|
||||||
line = 0
|
file, line := "???", 0
|
||||||
|
for i := 0; i < cnt; i++ {
|
||||||
|
frame, more := frames.Next()
|
||||||
|
fmt.Println(i, "\t", frame.File, frame.Line)
|
||||||
|
if !more || skipfunc == nil || !skipfunc(frame.File) {
|
||||||
|
file, line = frame.File, frame.Line
|
||||||
|
break
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Case 1: too short path, return directly
|
// Case 1: too short path, return directly
|
||||||
|
14
util.go
14
util.go
@ -21,9 +21,19 @@ func tryOptLogDirs(optLogDirs []string) (string, error) {
|
|||||||
for i, d := range optLogDirs {
|
for i, d := range optLogDirs {
|
||||||
dir := fmt.Sprintf("%s/", d)
|
dir := fmt.Sprintf("%s/", d)
|
||||||
optionDirsStr += fmt.Sprintf("%d.[%s];", i, dir)
|
optionDirsStr += fmt.Sprintf("%d.[%s];", i, dir)
|
||||||
if _, err := os.Stat(dir); err == nil {
|
if ok := canWriteByTest(dir); ok {
|
||||||
return dir, nil
|
return dir, nil
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return "", fmt.Errorf("all optional dir are not exist: %s", optionDirsStr)
|
return "", fmt.Errorf("all optional dir are not exist or writeable: %s", optionDirsStr)
|
||||||
|
}
|
||||||
|
|
||||||
|
// canWriteByTest
|
||||||
|
func canWriteByTest(dir string) bool {
|
||||||
|
testFile := filepath.Join(dir, ".write_test.log.tmp")
|
||||||
|
if err := os.WriteFile(testFile, []byte("test"), 0644); err != nil {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
os.Remove(testFile)
|
||||||
|
return true
|
||||||
}
|
}
|
||||||
|
19
writer.go
19
writer.go
@ -35,22 +35,23 @@ func NewBaseWriter(logw, stdw, errw *os.File) *baseWriter {
|
|||||||
|
|
||||||
// OpenLogFile
|
// OpenLogFile
|
||||||
func (w *baseWriter) OpenLogFile(logDir, logName string, optLogDirs []string) {
|
func (w *baseWriter) OpenLogFile(logDir, logName string, optLogDirs []string) {
|
||||||
|
realDir := ""
|
||||||
// Step 1. try get available log dir
|
// Step 1. try get available log dir
|
||||||
if _, err := os.Stat(logDir); err == nil {
|
if _, err := os.Stat(logDir); err == nil && canWriteByTest(logDir) {
|
||||||
logDir = logDir
|
realDir = logDir
|
||||||
} else if dir, err := tryOptLogDirs(optLogDirs); err == nil {
|
} else if dir, tryOptErr := tryOptLogDirs(optLogDirs); tryOptErr == nil {
|
||||||
logDir = dir
|
realDir = dir
|
||||||
} else if err := os.Mkdir(logDir, 0755); err == nil {
|
} else if err := os.Mkdir(logDir, 0755); err == nil {
|
||||||
logDir = logDir
|
realDir = logDir
|
||||||
} else {
|
} else {
|
||||||
errstr := fmt.Sprintf("all path not exist:\n "+
|
errstr := fmt.Sprintf("all path not exist or writeable:\n "+
|
||||||
"a.[%s]\n b.[%s]\n c.[%s]\n",
|
"logDir = %s, optLogDirs = %v\n",
|
||||||
logDir, "./log/", "./logs/")
|
logDir, optLogDirs)
|
||||||
panic("failed initlog:" + errstr)
|
panic("failed initlog:" + errstr)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Step 2. open base writer logfile
|
// Step 2. open base writer logfile
|
||||||
filename := filepath.Join(logDir, logName+".log")
|
filename := filepath.Join(realDir, logName+".log")
|
||||||
w.logFilename = filename
|
w.logFilename = filename
|
||||||
w.logPreBackupTag = ""
|
w.logPreBackupTag = ""
|
||||||
w.ReopenLogFile()
|
w.ReopenLogFile()
|
||||||
|
Loading…
Reference in New Issue
Block a user