jsonfilelog_test.go 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207
  1. package jsonfilelog
  2. import (
  3. "bytes"
  4. "encoding/json"
  5. "io/ioutil"
  6. "os"
  7. "path/filepath"
  8. "reflect"
  9. "strconv"
  10. "testing"
  11. "time"
  12. "github.com/docker/docker/daemon/logger"
  13. "github.com/docker/docker/daemon/logger/jsonfilelog/jsonlog"
  14. "github.com/gotestyourself/gotestyourself/fs"
  15. "github.com/stretchr/testify/require"
  16. )
  17. func TestJSONFileLogger(t *testing.T) {
  18. cid := "a7317399f3f857173c6179d44823594f8294678dea9999662e5c625b5a1c7657"
  19. tmp, err := ioutil.TempDir("", "docker-logger-")
  20. if err != nil {
  21. t.Fatal(err)
  22. }
  23. defer os.RemoveAll(tmp)
  24. filename := filepath.Join(tmp, "container.log")
  25. l, err := New(logger.Info{
  26. ContainerID: cid,
  27. LogPath: filename,
  28. })
  29. if err != nil {
  30. t.Fatal(err)
  31. }
  32. defer l.Close()
  33. if err := l.Log(&logger.Message{Line: []byte("line1"), Source: "src1"}); err != nil {
  34. t.Fatal(err)
  35. }
  36. if err := l.Log(&logger.Message{Line: []byte("line2"), Source: "src2"}); err != nil {
  37. t.Fatal(err)
  38. }
  39. if err := l.Log(&logger.Message{Line: []byte("line3"), Source: "src3"}); err != nil {
  40. t.Fatal(err)
  41. }
  42. res, err := ioutil.ReadFile(filename)
  43. if err != nil {
  44. t.Fatal(err)
  45. }
  46. expected := `{"log":"line1\n","stream":"src1","time":"0001-01-01T00:00:00Z"}
  47. {"log":"line2\n","stream":"src2","time":"0001-01-01T00:00:00Z"}
  48. {"log":"line3\n","stream":"src3","time":"0001-01-01T00:00:00Z"}
  49. `
  50. if string(res) != expected {
  51. t.Fatalf("Wrong log content: %q, expected %q", res, expected)
  52. }
  53. }
  54. func BenchmarkJSONFileLoggerLog(b *testing.B) {
  55. tmp := fs.NewDir(b, "bench-jsonfilelog")
  56. defer tmp.Remove()
  57. jsonlogger, err := New(logger.Info{
  58. ContainerID: "a7317399f3f857173c6179d44823594f8294678dea9999662e5c625b5a1c7657",
  59. LogPath: tmp.Join("container.log"),
  60. Config: map[string]string{
  61. "labels": "first,second",
  62. },
  63. ContainerLabels: map[string]string{
  64. "first": "label_value",
  65. "second": "label_foo",
  66. },
  67. })
  68. require.NoError(b, err)
  69. defer jsonlogger.Close()
  70. msg := &logger.Message{
  71. Line: []byte("Line that thinks that it is log line from docker\n"),
  72. Source: "stderr",
  73. Timestamp: time.Now().UTC(),
  74. }
  75. buf := bytes.NewBuffer(nil)
  76. require.NoError(b, marshalMessage(msg, nil, buf))
  77. b.SetBytes(int64(buf.Len()))
  78. b.ResetTimer()
  79. for i := 0; i < b.N; i++ {
  80. if err := jsonlogger.Log(msg); err != nil {
  81. b.Fatal(err)
  82. }
  83. }
  84. }
  85. func TestJSONFileLoggerWithOpts(t *testing.T) {
  86. cid := "a7317399f3f857173c6179d44823594f8294678dea9999662e5c625b5a1c7657"
  87. tmp, err := ioutil.TempDir("", "docker-logger-")
  88. if err != nil {
  89. t.Fatal(err)
  90. }
  91. defer os.RemoveAll(tmp)
  92. filename := filepath.Join(tmp, "container.log")
  93. config := map[string]string{"max-file": "2", "max-size": "1k"}
  94. l, err := New(logger.Info{
  95. ContainerID: cid,
  96. LogPath: filename,
  97. Config: config,
  98. })
  99. if err != nil {
  100. t.Fatal(err)
  101. }
  102. defer l.Close()
  103. for i := 0; i < 20; i++ {
  104. if err := l.Log(&logger.Message{Line: []byte("line" + strconv.Itoa(i)), Source: "src1"}); err != nil {
  105. t.Fatal(err)
  106. }
  107. }
  108. res, err := ioutil.ReadFile(filename)
  109. if err != nil {
  110. t.Fatal(err)
  111. }
  112. penUlt, err := ioutil.ReadFile(filename + ".1")
  113. if err != nil {
  114. t.Fatal(err)
  115. }
  116. expectedPenultimate := `{"log":"line0\n","stream":"src1","time":"0001-01-01T00:00:00Z"}
  117. {"log":"line1\n","stream":"src1","time":"0001-01-01T00:00:00Z"}
  118. {"log":"line2\n","stream":"src1","time":"0001-01-01T00:00:00Z"}
  119. {"log":"line3\n","stream":"src1","time":"0001-01-01T00:00:00Z"}
  120. {"log":"line4\n","stream":"src1","time":"0001-01-01T00:00:00Z"}
  121. {"log":"line5\n","stream":"src1","time":"0001-01-01T00:00:00Z"}
  122. {"log":"line6\n","stream":"src1","time":"0001-01-01T00:00:00Z"}
  123. {"log":"line7\n","stream":"src1","time":"0001-01-01T00:00:00Z"}
  124. {"log":"line8\n","stream":"src1","time":"0001-01-01T00:00:00Z"}
  125. {"log":"line9\n","stream":"src1","time":"0001-01-01T00:00:00Z"}
  126. {"log":"line10\n","stream":"src1","time":"0001-01-01T00:00:00Z"}
  127. {"log":"line11\n","stream":"src1","time":"0001-01-01T00:00:00Z"}
  128. {"log":"line12\n","stream":"src1","time":"0001-01-01T00:00:00Z"}
  129. {"log":"line13\n","stream":"src1","time":"0001-01-01T00:00:00Z"}
  130. {"log":"line14\n","stream":"src1","time":"0001-01-01T00:00:00Z"}
  131. {"log":"line15\n","stream":"src1","time":"0001-01-01T00:00:00Z"}
  132. `
  133. expected := `{"log":"line16\n","stream":"src1","time":"0001-01-01T00:00:00Z"}
  134. {"log":"line17\n","stream":"src1","time":"0001-01-01T00:00:00Z"}
  135. {"log":"line18\n","stream":"src1","time":"0001-01-01T00:00:00Z"}
  136. {"log":"line19\n","stream":"src1","time":"0001-01-01T00:00:00Z"}
  137. `
  138. if string(res) != expected {
  139. t.Fatalf("Wrong log content: %q, expected %q", res, expected)
  140. }
  141. if string(penUlt) != expectedPenultimate {
  142. t.Fatalf("Wrong log content: %q, expected %q", penUlt, expectedPenultimate)
  143. }
  144. }
  145. func TestJSONFileLoggerWithLabelsEnv(t *testing.T) {
  146. cid := "a7317399f3f857173c6179d44823594f8294678dea9999662e5c625b5a1c7657"
  147. tmp, err := ioutil.TempDir("", "docker-logger-")
  148. if err != nil {
  149. t.Fatal(err)
  150. }
  151. defer os.RemoveAll(tmp)
  152. filename := filepath.Join(tmp, "container.log")
  153. config := map[string]string{"labels": "rack,dc", "env": "environ,debug,ssl", "env-regex": "^dc"}
  154. l, err := New(logger.Info{
  155. ContainerID: cid,
  156. LogPath: filename,
  157. Config: config,
  158. ContainerLabels: map[string]string{"rack": "101", "dc": "lhr"},
  159. ContainerEnv: []string{"environ=production", "debug=false", "port=10001", "ssl=true", "dc_region=west"},
  160. })
  161. if err != nil {
  162. t.Fatal(err)
  163. }
  164. defer l.Close()
  165. if err := l.Log(&logger.Message{Line: []byte("line"), Source: "src1"}); err != nil {
  166. t.Fatal(err)
  167. }
  168. res, err := ioutil.ReadFile(filename)
  169. if err != nil {
  170. t.Fatal(err)
  171. }
  172. var jsonLog jsonlog.JSONLogs
  173. if err := json.Unmarshal(res, &jsonLog); err != nil {
  174. t.Fatal(err)
  175. }
  176. extra := make(map[string]string)
  177. if err := json.Unmarshal(jsonLog.RawAttrs, &extra); err != nil {
  178. t.Fatal(err)
  179. }
  180. expected := map[string]string{
  181. "rack": "101",
  182. "dc": "lhr",
  183. "environ": "production",
  184. "debug": "false",
  185. "ssl": "true",
  186. "dc_region": "west",
  187. }
  188. if !reflect.DeepEqual(extra, expected) {
  189. t.Fatalf("Wrong log attrs: %q, expected %q", extra, expected)
  190. }
  191. }