github.com/astaxie/beego@v1.12.3/logs/file_test.go (about)

     1  // Copyright 2014 beego Author. All Rights Reserved.
     2  //
     3  // Licensed under the Apache License, Version 2.0 (the "License");
     4  // you may not use this file except in compliance with the License.
     5  // You may obtain a copy of the License at
     6  //
     7  //      http://www.apache.org/licenses/LICENSE-2.0
     8  //
     9  // Unless required by applicable law or agreed to in writing, software
    10  // distributed under the License is distributed on an "AS IS" BASIS,
    11  // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    12  // See the License for the specific language governing permissions and
    13  // limitations under the License.
    14  
    15  package logs
    16  
    17  import (
    18  	"bufio"
    19  	"fmt"
    20  	"io/ioutil"
    21  	"os"
    22  	"strconv"
    23  	"testing"
    24  	"time"
    25  )
    26  
    27  func TestFilePerm(t *testing.T) {
    28  	log := NewLogger(10000)
    29  	// use 0666 as test perm cause the default umask is 022
    30  	log.SetLogger("file", `{"filename":"test.log", "perm": "0666"}`)
    31  	log.Debug("debug")
    32  	log.Informational("info")
    33  	log.Notice("notice")
    34  	log.Warning("warning")
    35  	log.Error("error")
    36  	log.Alert("alert")
    37  	log.Critical("critical")
    38  	log.Emergency("emergency")
    39  	file, err := os.Stat("test.log")
    40  	if err != nil {
    41  		t.Fatal(err)
    42  	}
    43  	if file.Mode() != 0666 {
    44  		t.Fatal("unexpected log file permission")
    45  	}
    46  	os.Remove("test.log")
    47  }
    48  
    49  func TestFile1(t *testing.T) {
    50  	log := NewLogger(10000)
    51  	log.SetLogger("file", `{"filename":"test.log"}`)
    52  	log.Debug("debug")
    53  	log.Informational("info")
    54  	log.Notice("notice")
    55  	log.Warning("warning")
    56  	log.Error("error")
    57  	log.Alert("alert")
    58  	log.Critical("critical")
    59  	log.Emergency("emergency")
    60  	f, err := os.Open("test.log")
    61  	if err != nil {
    62  		t.Fatal(err)
    63  	}
    64  	b := bufio.NewReader(f)
    65  	lineNum := 0
    66  	for {
    67  		line, _, err := b.ReadLine()
    68  		if err != nil {
    69  			break
    70  		}
    71  		if len(line) > 0 {
    72  			lineNum++
    73  		}
    74  	}
    75  	var expected = LevelDebug + 1
    76  	if lineNum != expected {
    77  		t.Fatal(lineNum, "not "+strconv.Itoa(expected)+" lines")
    78  	}
    79  	os.Remove("test.log")
    80  }
    81  
    82  func TestFile2(t *testing.T) {
    83  	log := NewLogger(10000)
    84  	log.SetLogger("file", fmt.Sprintf(`{"filename":"test2.log","level":%d}`, LevelError))
    85  	log.Debug("debug")
    86  	log.Info("info")
    87  	log.Notice("notice")
    88  	log.Warning("warning")
    89  	log.Error("error")
    90  	log.Alert("alert")
    91  	log.Critical("critical")
    92  	log.Emergency("emergency")
    93  	f, err := os.Open("test2.log")
    94  	if err != nil {
    95  		t.Fatal(err)
    96  	}
    97  	b := bufio.NewReader(f)
    98  	lineNum := 0
    99  	for {
   100  		line, _, err := b.ReadLine()
   101  		if err != nil {
   102  			break
   103  		}
   104  		if len(line) > 0 {
   105  			lineNum++
   106  		}
   107  	}
   108  	var expected = LevelError + 1
   109  	if lineNum != expected {
   110  		t.Fatal(lineNum, "not "+strconv.Itoa(expected)+" lines")
   111  	}
   112  	os.Remove("test2.log")
   113  }
   114  
   115  func TestFileDailyRotate_01(t *testing.T) {
   116  	log := NewLogger(10000)
   117  	log.SetLogger("file", `{"filename":"test3.log","maxlines":4}`)
   118  	log.Debug("debug")
   119  	log.Info("info")
   120  	log.Notice("notice")
   121  	log.Warning("warning")
   122  	log.Error("error")
   123  	log.Alert("alert")
   124  	log.Critical("critical")
   125  	log.Emergency("emergency")
   126  	rotateName := "test3" + fmt.Sprintf(".%s.%03d", time.Now().Format("2006-01-02"), 1) + ".log"
   127  	b, err := exists(rotateName)
   128  	if !b || err != nil {
   129  		os.Remove("test3.log")
   130  		t.Fatal("rotate not generated")
   131  	}
   132  	os.Remove(rotateName)
   133  	os.Remove("test3.log")
   134  }
   135  
   136  func TestFileDailyRotate_02(t *testing.T) {
   137  	fn1 := "rotate_day.log"
   138  	fn2 := "rotate_day." + time.Now().Add(-24*time.Hour).Format("2006-01-02") + ".001.log"
   139  	testFileRotate(t, fn1, fn2, true, false)
   140  }
   141  
   142  func TestFileDailyRotate_03(t *testing.T) {
   143  	fn1 := "rotate_day.log"
   144  	fn := "rotate_day." + time.Now().Add(-24*time.Hour).Format("2006-01-02") + ".log"
   145  	os.Create(fn)
   146  	fn2 := "rotate_day." + time.Now().Add(-24*time.Hour).Format("2006-01-02") + ".001.log"
   147  	testFileRotate(t, fn1, fn2, true, false)
   148  	os.Remove(fn)
   149  }
   150  
   151  func TestFileDailyRotate_04(t *testing.T) {
   152  	fn1 := "rotate_day.log"
   153  	fn2 := "rotate_day." + time.Now().Add(-24*time.Hour).Format("2006-01-02") + ".001.log"
   154  	testFileDailyRotate(t, fn1, fn2)
   155  }
   156  
   157  func TestFileDailyRotate_05(t *testing.T) {
   158  	fn1 := "rotate_day.log"
   159  	fn := "rotate_day." + time.Now().Add(-24*time.Hour).Format("2006-01-02") + ".log"
   160  	os.Create(fn)
   161  	fn2 := "rotate_day." + time.Now().Add(-24*time.Hour).Format("2006-01-02") + ".001.log"
   162  	testFileDailyRotate(t, fn1, fn2)
   163  	os.Remove(fn)
   164  }
   165  func TestFileDailyRotate_06(t *testing.T) { //test file mode
   166  	log := NewLogger(10000)
   167  	log.SetLogger("file", `{"filename":"test3.log","maxlines":4}`)
   168  	log.Debug("debug")
   169  	log.Info("info")
   170  	log.Notice("notice")
   171  	log.Warning("warning")
   172  	log.Error("error")
   173  	log.Alert("alert")
   174  	log.Critical("critical")
   175  	log.Emergency("emergency")
   176  	rotateName := "test3" + fmt.Sprintf(".%s.%03d", time.Now().Format("2006-01-02"), 1) + ".log"
   177  	s, _ := os.Lstat(rotateName)
   178  	if s.Mode() != 0440 {
   179  		os.Remove(rotateName)
   180  		os.Remove("test3.log")
   181  		t.Fatal("rotate file mode error")
   182  	}
   183  	os.Remove(rotateName)
   184  	os.Remove("test3.log")
   185  }
   186  
   187  func TestFileHourlyRotate_01(t *testing.T) {
   188  	log := NewLogger(10000)
   189  	log.SetLogger("file", `{"filename":"test3.log","hourly":true,"maxlines":4}`)
   190  	log.Debug("debug")
   191  	log.Info("info")
   192  	log.Notice("notice")
   193  	log.Warning("warning")
   194  	log.Error("error")
   195  	log.Alert("alert")
   196  	log.Critical("critical")
   197  	log.Emergency("emergency")
   198  	rotateName := "test3" + fmt.Sprintf(".%s.%03d", time.Now().Format("2006010215"), 1) + ".log"
   199  	b, err := exists(rotateName)
   200  	if !b || err != nil {
   201  		os.Remove("test3.log")
   202  		t.Fatal("rotate not generated")
   203  	}
   204  	os.Remove(rotateName)
   205  	os.Remove("test3.log")
   206  }
   207  
   208  func TestFileHourlyRotate_02(t *testing.T) {
   209  	fn1 := "rotate_hour.log"
   210  	fn2 := "rotate_hour." + time.Now().Add(-1*time.Hour).Format("2006010215") + ".001.log"
   211  	testFileRotate(t, fn1, fn2, false, true)
   212  }
   213  
   214  func TestFileHourlyRotate_03(t *testing.T) {
   215  	fn1 := "rotate_hour.log"
   216  	fn := "rotate_hour." + time.Now().Add(-1*time.Hour).Format("2006010215") + ".log"
   217  	os.Create(fn)
   218  	fn2 := "rotate_hour." + time.Now().Add(-1*time.Hour).Format("2006010215") + ".001.log"
   219  	testFileRotate(t, fn1, fn2, false, true)
   220  	os.Remove(fn)
   221  }
   222  
   223  func TestFileHourlyRotate_04(t *testing.T) {
   224  	fn1 := "rotate_hour.log"
   225  	fn2 := "rotate_hour." + time.Now().Add(-1*time.Hour).Format("2006010215") + ".001.log"
   226  	testFileHourlyRotate(t, fn1, fn2)
   227  }
   228  
   229  func TestFileHourlyRotate_05(t *testing.T) {
   230  	fn1 := "rotate_hour.log"
   231  	fn := "rotate_hour." + time.Now().Add(-1*time.Hour).Format("2006010215") + ".log"
   232  	os.Create(fn)
   233  	fn2 := "rotate_hour." + time.Now().Add(-1*time.Hour).Format("2006010215") + ".001.log"
   234  	testFileHourlyRotate(t, fn1, fn2)
   235  	os.Remove(fn)
   236  }
   237  
   238  func TestFileHourlyRotate_06(t *testing.T) { //test file mode
   239  	log := NewLogger(10000)
   240  	log.SetLogger("file", `{"filename":"test3.log", "hourly":true, "maxlines":4}`)
   241  	log.Debug("debug")
   242  	log.Info("info")
   243  	log.Notice("notice")
   244  	log.Warning("warning")
   245  	log.Error("error")
   246  	log.Alert("alert")
   247  	log.Critical("critical")
   248  	log.Emergency("emergency")
   249  	rotateName := "test3" + fmt.Sprintf(".%s.%03d", time.Now().Format("2006010215"), 1) + ".log"
   250  	s, _ := os.Lstat(rotateName)
   251  	if s.Mode() != 0440 {
   252  		os.Remove(rotateName)
   253  		os.Remove("test3.log")
   254  		t.Fatal("rotate file mode error")
   255  	}
   256  	os.Remove(rotateName)
   257  	os.Remove("test3.log")
   258  }
   259  
   260  func testFileRotate(t *testing.T, fn1, fn2 string, daily, hourly bool) {
   261  	fw := &fileLogWriter{
   262  		Daily:      daily,
   263  		MaxDays:    7,
   264  		Hourly:     hourly,
   265  		MaxHours:   168,
   266  		Rotate:     true,
   267  		Level:      LevelTrace,
   268  		Perm:       "0660",
   269  		RotatePerm: "0440",
   270  	}
   271  
   272  	if daily {
   273  		fw.Init(fmt.Sprintf(`{"filename":"%v","maxdays":1}`, fn1))
   274  		fw.dailyOpenTime = time.Now().Add(-24 * time.Hour)
   275  		fw.dailyOpenDate = fw.dailyOpenTime.Day()
   276  	}
   277  
   278  	if hourly {
   279  		fw.Init(fmt.Sprintf(`{"filename":"%v","maxhours":1}`, fn1))
   280  		fw.hourlyOpenTime = time.Now().Add(-1 * time.Hour)
   281  		fw.hourlyOpenDate = fw.hourlyOpenTime.Day()
   282  	}
   283  
   284  	fw.WriteMsg(time.Now(), "this is a msg for test", LevelDebug)
   285  
   286  	for _, file := range []string{fn1, fn2} {
   287  		_, err := os.Stat(file)
   288  		if err != nil {
   289  			t.Log(err)
   290  			t.FailNow()
   291  		}
   292  		os.Remove(file)
   293  	}
   294  	fw.Destroy()
   295  }
   296  
   297  func testFileDailyRotate(t *testing.T, fn1, fn2 string) {
   298  	fw := &fileLogWriter{
   299  		Daily:      true,
   300  		MaxDays:    7,
   301  		Rotate:     true,
   302  		Level:      LevelTrace,
   303  		Perm:       "0660",
   304  		RotatePerm: "0440",
   305  	}
   306  	fw.Init(fmt.Sprintf(`{"filename":"%v","maxdays":1}`, fn1))
   307  	fw.dailyOpenTime = time.Now().Add(-24 * time.Hour)
   308  	fw.dailyOpenDate = fw.dailyOpenTime.Day()
   309  	today, _ := time.ParseInLocation("2006-01-02", time.Now().Format("2006-01-02"), fw.dailyOpenTime.Location())
   310  	today = today.Add(-1 * time.Second)
   311  	fw.dailyRotate(today)
   312  	for _, file := range []string{fn1, fn2} {
   313  		_, err := os.Stat(file)
   314  		if err != nil {
   315  			t.FailNow()
   316  		}
   317  		content, err := ioutil.ReadFile(file)
   318  		if err != nil {
   319  			t.FailNow()
   320  		}
   321  		if len(content) > 0 {
   322  			t.FailNow()
   323  		}
   324  		os.Remove(file)
   325  	}
   326  	fw.Destroy()
   327  }
   328  
   329  func testFileHourlyRotate(t *testing.T, fn1, fn2 string) {
   330  	fw := &fileLogWriter{
   331  		Hourly:     true,
   332  		MaxHours:   168,
   333  		Rotate:     true,
   334  		Level:      LevelTrace,
   335  		Perm:       "0660",
   336  		RotatePerm: "0440",
   337  	}
   338  	fw.Init(fmt.Sprintf(`{"filename":"%v","maxhours":1}`, fn1))
   339  	fw.hourlyOpenTime = time.Now().Add(-1 * time.Hour)
   340  	fw.hourlyOpenDate = fw.hourlyOpenTime.Hour()
   341  	hour, _ := time.ParseInLocation("2006010215", time.Now().Format("2006010215"), fw.hourlyOpenTime.Location())
   342  	hour = hour.Add(-1 * time.Second)
   343  	fw.hourlyRotate(hour)
   344  	for _, file := range []string{fn1, fn2} {
   345  		_, err := os.Stat(file)
   346  		if err != nil {
   347  			t.FailNow()
   348  		}
   349  		content, err := ioutil.ReadFile(file)
   350  		if err != nil {
   351  			t.FailNow()
   352  		}
   353  		if len(content) > 0 {
   354  			t.FailNow()
   355  		}
   356  		os.Remove(file)
   357  	}
   358  	fw.Destroy()
   359  }
   360  func exists(path string) (bool, error) {
   361  	_, err := os.Stat(path)
   362  	if err == nil {
   363  		return true, nil
   364  	}
   365  	if os.IsNotExist(err) {
   366  		return false, nil
   367  	}
   368  	return false, err
   369  }
   370  
   371  func BenchmarkFile(b *testing.B) {
   372  	log := NewLogger(100000)
   373  	log.SetLogger("file", `{"filename":"test4.log"}`)
   374  	for i := 0; i < b.N; i++ {
   375  		log.Debug("debug")
   376  	}
   377  	os.Remove("test4.log")
   378  }
   379  
   380  func BenchmarkFileAsynchronous(b *testing.B) {
   381  	log := NewLogger(100000)
   382  	log.SetLogger("file", `{"filename":"test4.log"}`)
   383  	log.Async()
   384  	for i := 0; i < b.N; i++ {
   385  		log.Debug("debug")
   386  	}
   387  	os.Remove("test4.log")
   388  }
   389  
   390  func BenchmarkFileCallDepth(b *testing.B) {
   391  	log := NewLogger(100000)
   392  	log.SetLogger("file", `{"filename":"test4.log"}`)
   393  	log.EnableFuncCallDepth(true)
   394  	log.SetLogFuncCallDepth(2)
   395  	for i := 0; i < b.N; i++ {
   396  		log.Debug("debug")
   397  	}
   398  	os.Remove("test4.log")
   399  }
   400  
   401  func BenchmarkFileAsynchronousCallDepth(b *testing.B) {
   402  	log := NewLogger(100000)
   403  	log.SetLogger("file", `{"filename":"test4.log"}`)
   404  	log.EnableFuncCallDepth(true)
   405  	log.SetLogFuncCallDepth(2)
   406  	log.Async()
   407  	for i := 0; i < b.N; i++ {
   408  		log.Debug("debug")
   409  	}
   410  	os.Remove("test4.log")
   411  }
   412  
   413  func BenchmarkFileOnGoroutine(b *testing.B) {
   414  	log := NewLogger(100000)
   415  	log.SetLogger("file", `{"filename":"test4.log"}`)
   416  	for i := 0; i < b.N; i++ {
   417  		go log.Debug("debug")
   418  	}
   419  	os.Remove("test4.log")
   420  }