package loggerx_test import ( "context" "fmt" "os" "path/filepath" "strings" "testing" "github.com/yuninks/loggerx" ) // 异步模式下 Channel + error 组合是否落盘 func TestAsyncChannelErrorWrites(t *testing.T) { dir := t.TempDir() l := loggerx.NewLogger(context.Background(), loggerx.SetDir(dir), loggerx.SetWriteAsync(), loggerx.SetSizeSplit(6*1024), ) for i := 0; i < 10; i++ { l.Info(context.Background(), "main") l.Channel("sub").Errorf(context.Background(), "ERR-%d", i) l.Channel("sub").Infof(context.Background(), "SUBINFO-%d", i) l.Errorf(context.Background(), "MAINERR-%d", i) } if err := l.Close(); err != nil { t.Fatalf("Close: %v", err) } _ = filepath.Walk(dir, func(p string, info os.FileInfo, err error) error { if err != nil { return nil } rel, _ := filepath.Rel(dir, p) if info.IsDir() { t.Logf(" [dir] %s", rel) } else { t.Logf(" [file] %s %d", rel, info.Size()) } return nil }) // sub channel 的日志必须落在 sub 子目录,不能混进根目录 all := readAllLogs(t, dir) if n := countOf(all, "SUBINFO"); n != 0 { t.Errorf("根目录日志里混入了 %d 条 sub channel 的 info 日志", n) } if _, err := os.Stat(filepath.Join(dir, "sub")); err != nil { t.Fatalf("channel 目录不存在: %v", err) } sub := readAllIn(t, dir, "sub") for i := 0; i < 10; i++ { if !strings.Contains(sub, fmt.Sprintf("ERR-%d", i)) { t.Errorf("sub channel 丢失 error 日志 ERR-%d", i) } if !strings.Contains(sub, fmt.Sprintf("SUBINFO-%d", i)) { t.Errorf("sub channel 丢失 info 日志 SUBINFO-%d", i) } } } func countOf(s, sub string) int { n := 0 for i := 0; i+len(sub) <= len(s); i++ { if s[i:i+len(sub)] == sub { n++ } } return n }