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  }