Beego/logs/file_test.go

421 lines
11 KiB
Go
Raw Normal View History

2014-08-18 08:41:43 +00:00
// Copyright 2014 beego Author. All Rights Reserved.
2014-07-03 15:40:21 +00:00
//
2014-08-18 08:41:43 +00:00
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
2014-07-03 15:40:21 +00:00
//
2014-08-18 08:41:43 +00:00
// http://www.apache.org/licenses/LICENSE-2.0
2014-07-03 15:40:21 +00:00
//
2014-08-18 08:41:43 +00:00
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
2013-08-27 15:48:58 +00:00
package logs
import (
"bufio"
"fmt"
2016-05-06 04:09:00 +00:00
"io/ioutil"
2013-08-27 15:48:58 +00:00
"os"
"strconv"
2013-08-27 15:48:58 +00:00
"testing"
"time"
)
func TestFilePerm(t *testing.T) {
log := NewLogger(10000)
// use 0666 as test perm cause the default umask is 022
log.SetLogger("file", `{"filename":"test.log", "perm": "0666"}`)
log.Debug("debug")
log.Informational("info")
log.Notice("notice")
log.Warning("warning")
log.Error("error")
log.Alert("alert")
log.Critical("critical")
log.Emergency("emergency")
file, err := os.Stat("test.log")
if err != nil {
t.Fatal(err)
}
if file.Mode() != 0666 {
t.Fatal("unexpected log file permission")
}
os.Remove("test.log")
}
2016-01-13 01:21:32 +00:00
func TestFile1(t *testing.T) {
2013-08-27 15:48:58 +00:00
log := NewLogger(10000)
log.SetLogger("file", `{"filename":"test.log"}`)
log.Debug("debug")
log.Informational("info")
log.Notice("notice")
log.Warning("warning")
2013-08-27 15:48:58 +00:00
log.Error("error")
log.Alert("alert")
2013-08-27 15:48:58 +00:00
log.Critical("critical")
log.Emergency("emergency")
2013-08-27 15:48:58 +00:00
f, err := os.Open("test.log")
if err != nil {
t.Fatal(err)
}
b := bufio.NewReader(f)
2016-01-13 01:21:32 +00:00
lineNum := 0
2013-08-27 15:48:58 +00:00
for {
line, _, err := b.ReadLine()
if err != nil {
break
}
if len(line) > 0 {
2016-01-13 01:21:32 +00:00
lineNum++
2013-08-27 15:48:58 +00:00
}
}
var expected = LevelDebug + 1
2016-01-13 01:21:32 +00:00
if lineNum != expected {
t.Fatal(lineNum, "not "+strconv.Itoa(expected)+" lines")
2013-08-27 15:48:58 +00:00
}
os.Remove("test.log")
}
func TestFile2(t *testing.T) {
log := NewLogger(10000)
log.SetLogger("file", fmt.Sprintf(`{"filename":"test2.log","level":%d}`, LevelError))
2013-08-27 15:48:58 +00:00
log.Debug("debug")
log.Info("info")
log.Notice("notice")
log.Warning("warning")
2013-08-27 15:48:58 +00:00
log.Error("error")
log.Alert("alert")
2013-08-27 15:48:58 +00:00
log.Critical("critical")
log.Emergency("emergency")
2013-08-27 15:48:58 +00:00
f, err := os.Open("test2.log")
if err != nil {
t.Fatal(err)
}
b := bufio.NewReader(f)
2016-01-13 01:21:32 +00:00
lineNum := 0
2013-08-27 15:48:58 +00:00
for {
line, _, err := b.ReadLine()
if err != nil {
break
}
if len(line) > 0 {
2016-01-13 01:21:32 +00:00
lineNum++
2013-08-27 15:48:58 +00:00
}
}
var expected = LevelError + 1
2016-01-13 01:21:32 +00:00
if lineNum != expected {
t.Fatal(lineNum, "not "+strconv.Itoa(expected)+" lines")
2013-08-27 15:48:58 +00:00
}
os.Remove("test2.log")
}
2017-12-20 08:19:58 +00:00
func TestFileDailyRotate_01(t *testing.T) {
2013-08-27 15:48:58 +00:00
log := NewLogger(10000)
log.SetLogger("file", `{"filename":"test3.log","maxlines":4}`)
log.Debug("debug")
log.Info("info")
log.Notice("notice")
log.Warning("warning")
2013-08-27 15:48:58 +00:00
log.Error("error")
log.Alert("alert")
2013-08-27 15:48:58 +00:00
log.Critical("critical")
log.Emergency("emergency")
2016-01-13 01:21:32 +00:00
rotateName := "test3" + fmt.Sprintf(".%s.%03d", time.Now().Format("2006-01-02"), 1) + ".log"
b, err := exists(rotateName)
2013-08-27 15:48:58 +00:00
if !b || err != nil {
2016-01-13 01:21:32 +00:00
os.Remove("test3.log")
t.Fatal("rotate not generated")
2013-08-27 15:48:58 +00:00
}
2016-01-13 01:21:32 +00:00
os.Remove(rotateName)
2013-08-27 15:48:58 +00:00
os.Remove("test3.log")
}
2017-12-20 08:19:58 +00:00
func TestFileDailyRotate_02(t *testing.T) {
2016-04-13 01:05:16 +00:00
fn1 := "rotate_day.log"
2018-07-20 06:26:43 +00:00
fn2 := "rotate_day." + time.Now().Add(-24*time.Hour).Format("2006-01-02") + ".001.log"
2017-12-20 08:19:58 +00:00
testFileRotate(t, fn1, fn2, true, false)
2016-04-13 01:05:16 +00:00
}
2017-12-20 08:19:58 +00:00
func TestFileDailyRotate_03(t *testing.T) {
2016-04-13 01:05:16 +00:00
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"
2017-12-20 08:19:58 +00:00
testFileRotate(t, fn1, fn2, true, false)
2016-04-13 01:05:16 +00:00
os.Remove(fn)
}
2017-12-20 08:19:58 +00:00
func TestFileDailyRotate_04(t *testing.T) {
2016-05-06 04:09:00 +00:00
fn1 := "rotate_day.log"
2018-07-20 06:26:43 +00:00
fn2 := "rotate_day." + time.Now().Add(-24*time.Hour).Format("2006-01-02") + ".001.log"
2016-05-06 04:09:00 +00:00
testFileDailyRotate(t, fn1, fn2)
}
2017-12-20 08:19:58 +00:00
func TestFileDailyRotate_05(t *testing.T) {
2016-05-06 04:09:00 +00:00
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"
testFileDailyRotate(t, fn1, fn2)
os.Remove(fn)
}
2017-12-20 08:19:58 +00:00
func TestFileDailyRotate_06(t *testing.T) { //test file mode
2017-04-10 09:36:17 +00:00
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("2006-01-02"), 1) + ".log"
2017-04-20 02:56:09 +00:00
s, _ := os.Lstat(rotateName)
2017-04-10 09:36:17 +00:00
if s.Mode() != 0440 {
os.Remove(rotateName)
os.Remove("test3.log")
t.Fatal("rotate file mode error")
}
os.Remove(rotateName)
os.Remove("test3.log")
}
2017-12-20 08:19:58 +00:00
func TestFileHourlyRotate_01(t *testing.T) {
log := NewLogger(10000)
2017-12-20 09:54:40 +00:00
log.SetLogger("file", `{"filename":"test3.log","hourly":true,"maxlines":4}`)
2017-12-20 08:19:58 +00:00
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"
2018-07-26 07:08:14 +00:00
fn2 := "rotate_hour." + time.Now().Add(-1*time.Hour).Format("2006010215") + ".001.log"
2017-12-20 08:19:58 +00:00
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"
2018-07-26 07:08:14 +00:00
fn2 := "rotate_hour." + time.Now().Add(-1*time.Hour).Format("2006010215") + ".001.log"
2017-12-20 08:19:58 +00:00
testFileHourlyRotate(t, fn1, fn2)
}
2017-12-20 09:54:40 +00:00
2017-12-20 08:19:58 +00:00
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)
}
2017-12-20 09:54:40 +00:00
2017-12-20 08:19:58 +00:00
func TestFileHourlyRotate_06(t *testing.T) { //test file mode
log := NewLogger(10000)
2017-12-20 09:54:40 +00:00
log.SetLogger("file", `{"filename":"test3.log", "hourly":true, "maxlines":4}`)
2017-12-20 08:19:58 +00:00
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")
}
2017-12-20 09:54:40 +00:00
2017-12-20 08:19:58 +00:00
func testFileRotate(t *testing.T, fn1, fn2 string, daily, hourly bool) {
2016-04-13 01:05:16 +00:00
fw := &fileLogWriter{
2017-12-20 08:19:58 +00:00
Daily: daily,
MaxDays: 7,
2017-12-20 08:19:58 +00:00
Hourly: hourly,
MaxHours: 168,
Rotate: true,
Level: LevelTrace,
Perm: "0660",
RotatePerm: "0440",
2016-04-13 01:05:16 +00:00
}
2017-12-20 08:19:58 +00:00
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)
2016-04-13 01:05:16 +00:00
for _, file := range []string{fn1, fn2} {
_, err := os.Stat(file)
if err != nil {
2018-07-20 06:26:43 +00:00
t.Log(err)
2016-04-13 01:05:16 +00:00
t.FailNow()
}
os.Remove(file)
}
2016-05-06 04:09:00 +00:00
fw.Destroy()
}
func testFileDailyRotate(t *testing.T, fn1, fn2 string) {
fw := &fileLogWriter{
Daily: true,
MaxDays: 7,
Rotate: true,
Level: LevelTrace,
Perm: "0660",
RotatePerm: "0440",
2016-05-06 04:09:00 +00:00
}
fw.Init(fmt.Sprintf(`{"filename":"%v","maxdays":1}`, fn1))
fw.dailyOpenTime = time.Now().Add(-24 * time.Hour)
fw.dailyOpenDate = fw.dailyOpenTime.Day()
today, _ := time.ParseInLocation("2006-01-02", time.Now().Format("2006-01-02"), fw.dailyOpenTime.Location())
today = today.Add(-1 * time.Second)
fw.dailyRotate(today)
for _, file := range []string{fn1, fn2} {
_, err := os.Stat(file)
if err != nil {
t.FailNow()
}
content, err := ioutil.ReadFile(file)
if err != nil {
t.FailNow()
}
if len(content) > 0 {
t.FailNow()
}
os.Remove(file)
}
fw.Destroy()
2016-04-13 01:05:16 +00:00
}
2017-12-20 09:54:40 +00:00
func testFileHourlyRotate(t *testing.T, fn1, fn2 string) {
fw := &fileLogWriter{
Hourly: true,
MaxHours: 168,
Rotate: true,
Level: LevelTrace,
Perm: "0660",
RotatePerm: "0440",
}
fw.Init(fmt.Sprintf(`{"filename":"%v","maxhours":1}`, fn1))
fw.hourlyOpenTime = time.Now().Add(-1 * time.Hour)
fw.hourlyOpenDate = fw.hourlyOpenTime.Hour()
hour, _ := time.ParseInLocation("2006010215", time.Now().Format("2006010215"), fw.hourlyOpenTime.Location())
hour = hour.Add(-1 * time.Second)
fw.hourlyRotate(hour)
for _, file := range []string{fn1, fn2} {
_, err := os.Stat(file)
if err != nil {
t.FailNow()
}
content, err := ioutil.ReadFile(file)
if err != nil {
t.FailNow()
}
if len(content) > 0 {
t.FailNow()
}
os.Remove(file)
}
fw.Destroy()
}
2013-08-27 15:48:58 +00:00
func exists(path string) (bool, error) {
_, err := os.Stat(path)
if err == nil {
return true, nil
}
if os.IsNotExist(err) {
return false, nil
}
return false, err
}
func BenchmarkFile(b *testing.B) {
log := NewLogger(100000)
log.SetLogger("file", `{"filename":"test4.log"}`)
for i := 0; i < b.N; i++ {
log.Debug("debug")
}
os.Remove("test4.log")
}
2016-01-12 09:59:23 +00:00
2016-01-13 01:21:32 +00:00
func BenchmarkFileAsynchronous(b *testing.B) {
2016-01-12 09:59:23 +00:00
log := NewLogger(100000)
log.SetLogger("file", `{"filename":"test4.log"}`)
log.Async()
for i := 0; i < b.N; i++ {
log.Debug("debug")
}
os.Remove("test4.log")
}
2016-01-13 01:21:32 +00:00
func BenchmarkFileCallDepth(b *testing.B) {
log := NewLogger(100000)
log.SetLogger("file", `{"filename":"test4.log"}`)
log.EnableFuncCallDepth(true)
log.SetLogFuncCallDepth(2)
for i := 0; i < b.N; i++ {
log.Debug("debug")
}
os.Remove("test4.log")
}
2016-01-13 01:21:32 +00:00
func BenchmarkFileAsynchronousCallDepth(b *testing.B) {
log := NewLogger(100000)
log.SetLogger("file", `{"filename":"test4.log"}`)
log.EnableFuncCallDepth(true)
log.SetLogFuncCallDepth(2)
log.Async()
for i := 0; i < b.N; i++ {
log.Debug("debug")
}
os.Remove("test4.log")
}
2016-01-13 01:21:32 +00:00
func BenchmarkFileOnGoroutine(b *testing.B) {
log := NewLogger(100000)
log.SetLogger("file", `{"filename":"test4.log"}`)
for i := 0; i < b.N; i++ {
2016-01-17 15:57:07 +00:00
go log.Debug("debug")
2016-01-13 01:21:32 +00:00
}
os.Remove("test4.log")
}