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