diff --git a/logs/file.go b/logs/file.go index 285cedae..9c29e487 100644 --- a/logs/file.go +++ b/logs/file.go @@ -123,7 +123,7 @@ func (w *fileLogWriter) startLogger() error { return w.initFd() } -func (w *fileLogWriter) needRotate(size int, day int) bool { +func (w *fileLogWriter) needRotateDaily(size int, day int) bool { return (w.MaxLines > 0 && w.maxLinesCurLines >= w.MaxLines) || (w.MaxSize > 0 && w.maxSizeCurSize >= w.MaxSize) || (w.Daily && day != w.dailyOpenDate) diff --git a/logs/file_test.go b/logs/file_test.go index 626521b9..621638b7 100644 --- a/logs/file_test.go +++ b/logs/file_test.go @@ -112,7 +112,7 @@ func TestFile2(t *testing.T) { os.Remove("test2.log") } -func TestFileRotate_01(t *testing.T) { +func TestFileDailyRotate_01(t *testing.T) { log := NewLogger(10000) log.SetLogger("file", `{"filename":"test3.log","maxlines":4}`) log.Debug("debug") @@ -133,28 +133,28 @@ func TestFileRotate_01(t *testing.T) { os.Remove("test3.log") } -func TestFileRotate_02(t *testing.T) { +func TestFileDailyRotate_02(t *testing.T) { fn1 := "rotate_day.log" fn2 := "rotate_day." + time.Now().Add(-24*time.Hour).Format("2006-01-02") + ".log" - testFileRotate(t, fn1, fn2) + testFileRotate(t, fn1, fn2, true, false) } -func TestFileRotate_03(t *testing.T) { +func TestFileDailyRotate_03(t *testing.T) { fn1 := "rotate_day.log" fn := "rotate_day." + time.Now().Add(-24*time.Hour).Format("2006-01-02") + ".log" os.Create(fn) fn2 := "rotate_day." + time.Now().Add(-24*time.Hour).Format("2006-01-02") + ".001.log" - testFileRotate(t, fn1, fn2) + testFileRotate(t, fn1, fn2, true, false) os.Remove(fn) } -func TestFileRotate_04(t *testing.T) { +func TestFileDailyRotate_04(t *testing.T) { fn1 := "rotate_day.log" fn2 := "rotate_day." + time.Now().Add(-24*time.Hour).Format("2006-01-02") + ".log" testFileDailyRotate(t, fn1, fn2) } -func TestFileRotate_05(t *testing.T) { +func TestFileDailyRotate_05(t *testing.T) { fn1 := "rotate_day.log" fn := "rotate_day." + time.Now().Add(-24*time.Hour).Format("2006-01-02") + ".log" os.Create(fn) @@ -162,7 +162,7 @@ func TestFileRotate_05(t *testing.T) { testFileDailyRotate(t, fn1, fn2) os.Remove(fn) } -func TestFileRotate_06(t *testing.T) { //test file mode +func TestFileDailyRotate_06(t *testing.T) { //test file mode log := NewLogger(10000) log.SetLogger("file", `{"filename":"test3.log","maxlines":4}`) log.Debug("debug") @@ -183,19 +183,104 @@ func TestFileRotate_06(t *testing.T) { //test file mode os.Remove(rotateName) os.Remove("test3.log") } -func testFileRotate(t *testing.T, fn1, fn2 string) { + +func TestFileHourlyRotate_01(t *testing.T) { + log := NewLogger(10000) + log.SetLogger("file", `{"filename":"test3.log","maxlines":4}`) + log.Debug("debug") + log.Info("info") + log.Notice("notice") + log.Warning("warning") + log.Error("error") + log.Alert("alert") + log.Critical("critical") + log.Emergency("emergency") + rotateName := "test3" + fmt.Sprintf(".%s.%03d", time.Now().Format("2006010215"), 1) + ".log" + b, err := exists(rotateName) + if !b || err != nil { + os.Remove("test3.log") + t.Fatal("rotate not generated") + } + os.Remove(rotateName) + os.Remove("test3.log") +} + +func TestFileHourlyRotate_02(t *testing.T) { + fn1 := "rotate_hour.log" + fn2 := "rotate_hour." + time.Now().Add(-1*time.Hour).Format("2006010215") + ".log" + testFileRotate(t, fn1, fn2, false, true) +} + +func TestFileHourlyRotate_03(t *testing.T) { + fn1 := "rotate_hour.log" + fn := "rotate_hour." + time.Now().Add(-1*time.Hour).Format("2006010215") + ".log" + os.Create(fn) + fn2 := "rotate_hour." + time.Now().Add(-1*time.Hour).Format("2006010215") + ".001.log" + testFileRotate(t, fn1, fn2, false, true) + os.Remove(fn) +} + +/* +func TestFileHourlyRotate_04(t *testing.T) { + fn1 := "rotate_hour.log" + fn2 := "rotate_hour." + time.Now().Add(-1*time.Hour).Format("2006010215") + ".log" + testFileHourlyRotate(t, fn1, fn2) +} +func TestFileHourlyRotate_05(t *testing.T) { + fn1 := "rotate_hour.log" + fn := "rotate_hour." + time.Now().Add(-1*time.Hour).Format("2006010215") + ".log" + os.Create(fn) + fn2 := "rotate_hour." + time.Now().Add(-1*time.Hour).Format("2006010215") + ".001.log" + testFileHourlyRotate(t, fn1, fn2) + os.Remove(fn) +} +func TestFileHourlyRotate_06(t *testing.T) { //test file mode + log := NewLogger(10000) + log.SetLogger("file", `{"filename":"test3.log","maxlines":4}`) + log.Debug("debug") + log.Info("info") + log.Notice("notice") + log.Warning("warning") + log.Error("error") + log.Alert("alert") + log.Critical("critical") + log.Emergency("emergency") + rotateName := "test3" + fmt.Sprintf(".%s.%03d", time.Now().Format("2006010215"), 1) + ".log" + s, _ := os.Lstat(rotateName) + if s.Mode() != 0440 { + os.Remove(rotateName) + os.Remove("test3.log") + t.Fatal("rotate file mode error") + } + os.Remove(rotateName) + os.Remove("test3.log") +} +*/ +func testFileRotate(t *testing.T, fn1, fn2 string, daily, hourly bool) { fw := &fileLogWriter{ - Daily: true, + Daily: daily, MaxDays: 7, + Hourly: hourly, + MaxHours: 168, Rotate: true, Level: LevelTrace, Perm: "0660", RotatePerm: "0440", } - fw.Init(fmt.Sprintf(`{"filename":"%v","maxdays":1}`, fn1)) - fw.dailyOpenTime = time.Now().Add(-24 * time.Hour) - fw.dailyOpenDate = fw.dailyOpenTime.Day() - fw.WriteMsg(time.Now(), "this is a msg for test", LevelDebug) + + if daily { + fw.Init(fmt.Sprintf(`{"filename":"%v","maxdays":1}`, fn1)) + fw.dailyOpenTime = time.Now().Add(-24 * time.Hour) + fw.dailyOpenDate = fw.dailyOpenTime.Day() + } + + if hourly { + fw.Init(fmt.Sprintf(`{"filename":"%v","maxhours":1}`, fn1)) + fw.hourlyOpenTime = time.Now().Add(-1 * time.Hour) + fw.hourlyOpenDate = fw.hourlyOpenTime.Day() + } + + fw.WriteMsg(time.Now(), "this is a msg for test", LevelDebug) for _, file := range []string{fn1, fn2} { _, err := os.Stat(file) diff --git a/logs/logger.go b/logs/logger.go index 1700901f..fa6d9334 100644 --- a/logs/logger.go +++ b/logs/logger.go @@ -33,7 +33,7 @@ func newLogWriter(wr io.Writer) *logWriter { func (lg *logWriter) println(when time.Time, msg string) { lg.Lock() - h, _ := formatTimeHeader(when) + h, _, _:= formatTimeHeader(when) lg.writer.Write(append(append(h, msg...), '\n')) lg.Unlock() } @@ -90,7 +90,7 @@ const ( ns1 = `0123456789` ) -func formatTimeHeader(when time.Time) ([]byte, int) { +func formatTimeHeader(when time.Time) ([]byte, int, int) { y, mo, d := when.Date() h, mi, s := when.Clock() ns := when.Nanosecond()/1000000 @@ -123,7 +123,7 @@ func formatTimeHeader(when time.Time) ([]byte, int) { buf[23] = ' ' - return buf[0:], d + return buf[0:], d, h } var ( diff --git a/logs/logger_test.go b/logs/logger_test.go index 69a8f0d2..5a0a423d 100644 --- a/logs/logger_test.go +++ b/logs/logger_test.go @@ -30,7 +30,7 @@ func TestFormatHeader_0(t *testing.T) { if tm.Year() >= 2100 { break } - h, _ := formatTimeHeader(tm) + h, _, _ := formatTimeHeader(tm) if tm.Format("2006/01/02 15:04:05.999 ") != string(h) { t.Log(tm) t.FailNow() @@ -48,7 +48,7 @@ func TestFormatHeader_1(t *testing.T) { if tm.Year() >= year+1 { break } - h, _ := formatTimeHeader(tm) + h, _, _ := formatTimeHeader(tm) if tm.Format("2006/01/02 15:04:05.999 ") != string(h) { t.Log(tm) t.FailNow()