高热共公日志库
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

421 lines
11 KiB

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