add skipfunc

This commit is contained in:
bryanqiu 2025-04-10 18:09:34 +08:00
parent 8cd13a5663
commit af595ae6d5
3 changed files with 41 additions and 17 deletions

25
log.go
View File

@ -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
View File

@ -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
} }

View File

@ -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()