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 }