Signed-off-by: Daniel Nephin <dnephin@docker.com>
| ... | ... |
@@ -11,7 +11,7 @@ import ( |
| 11 | 11 |
"github.com/docker/docker/api/types" |
| 12 | 12 |
"github.com/docker/docker/api/types/backend" |
| 13 | 13 |
"github.com/docker/docker/pkg/ioutils" |
| 14 |
- "github.com/docker/docker/pkg/jsonlog" |
|
| 14 |
+ "github.com/docker/docker/pkg/jsonmessage" |
|
| 15 | 15 |
"github.com/docker/docker/pkg/stdcopy" |
| 16 | 16 |
) |
| 17 | 17 |
|
| ... | ... |
@@ -49,11 +49,7 @@ func WriteLogStream(_ context.Context, w io.Writer, msgs <-chan *backend.LogMess |
| 49 | 49 |
logLine = append(logLine, msg.Line...) |
| 50 | 50 |
} |
| 51 | 51 |
if config.Timestamps {
|
| 52 |
- // TODO(dperny) the format is defined in |
|
| 53 |
- // daemon/logger/logger.go as logger.TimeFormat. importing |
|
| 54 |
- // logger is verboten (not part of backend) so idk if just |
|
| 55 |
- // importing the same thing from jsonlog is good enough |
|
| 56 |
- logLine = append([]byte(msg.Timestamp.Format(jsonlog.RFC3339NanoFixed)+" "), logLine...) |
|
| 52 |
+ logLine = append([]byte(msg.Timestamp.Format(jsonmessage.RFC3339NanoFixed)+" "), logLine...) |
|
| 57 | 53 |
} |
| 58 | 54 |
if msg.Source == "stdout" && config.ShowStdout {
|
| 59 | 55 |
outStream.Write(logLine) |
| ... | ... |
@@ -38,7 +38,7 @@ import ( |
| 38 | 38 |
"github.com/docker/docker/libcontainerd" |
| 39 | 39 |
dopts "github.com/docker/docker/opts" |
| 40 | 40 |
"github.com/docker/docker/pkg/authorization" |
| 41 |
- "github.com/docker/docker/pkg/jsonlog" |
|
| 41 |
+ "github.com/docker/docker/pkg/jsonmessage" |
|
| 42 | 42 |
"github.com/docker/docker/pkg/pidfile" |
| 43 | 43 |
"github.com/docker/docker/pkg/plugingetter" |
| 44 | 44 |
"github.com/docker/docker/pkg/signal" |
| ... | ... |
@@ -94,7 +94,7 @@ func (cli *DaemonCli) start(opts *daemonOptions) (err error) {
|
| 94 | 94 |
} |
| 95 | 95 |
|
| 96 | 96 |
logrus.SetFormatter(&logrus.TextFormatter{
|
| 97 |
- TimestampFormat: jsonlog.RFC3339NanoFixed, |
|
| 97 |
+ TimestampFormat: jsonmessage.RFC3339NanoFixed, |
|
| 98 | 98 |
DisableColors: cli.Config.RawLogs, |
| 99 | 99 |
FullTimestamp: true, |
| 100 | 100 |
}) |
| ... | ... |
@@ -12,7 +12,6 @@ import ( |
| 12 | 12 |
"time" |
| 13 | 13 |
|
| 14 | 14 |
"github.com/docker/docker/api/types/backend" |
| 15 |
- "github.com/docker/docker/pkg/jsonlog" |
|
| 16 | 15 |
) |
| 17 | 16 |
|
| 18 | 17 |
// ErrReadLogsNotSupported is returned when the underlying log driver does not support reading |
| ... | ... |
@@ -26,8 +25,6 @@ func (ErrReadLogsNotSupported) Error() string {
|
| 26 | 26 |
func (ErrReadLogsNotSupported) NotImplemented() {}
|
| 27 | 27 |
|
| 28 | 28 |
const ( |
| 29 |
- // TimeFormat is the time format used for timestamps sent to log readers. |
|
| 30 |
- TimeFormat = jsonlog.RFC3339NanoFixed |
|
| 31 | 29 |
logWatcherBufferSize = 4096 |
| 32 | 30 |
) |
| 33 | 31 |
|
| ... | ... |
@@ -10,7 +10,7 @@ import ( |
| 10 | 10 |
|
| 11 | 11 |
"github.com/docker/docker/integration-cli/checker" |
| 12 | 12 |
"github.com/docker/docker/integration-cli/cli" |
| 13 |
- "github.com/docker/docker/pkg/jsonlog" |
|
| 13 |
+ "github.com/docker/docker/pkg/jsonmessage" |
|
| 14 | 14 |
"github.com/go-check/check" |
| 15 | 15 |
"github.com/gotestyourself/gotestyourself/icmd" |
| 16 | 16 |
) |
| ... | ... |
@@ -55,7 +55,7 @@ func (s *DockerSuite) TestLogsTimestamps(c *check.C) {
|
| 55 | 55 |
|
| 56 | 56 |
for _, l := range lines {
|
| 57 | 57 |
if l != "" {
|
| 58 |
- _, err := time.Parse(jsonlog.RFC3339NanoFixed+" ", ts.FindString(l)) |
|
| 58 |
+ _, err := time.Parse(jsonmessage.RFC3339NanoFixed+" ", ts.FindString(l)) |
|
| 59 | 59 |
c.Assert(err, checker.IsNil, check.Commentf("Failed to parse timestamp from %v", l))
|
| 60 | 60 |
// ensure we have padded 0's |
| 61 | 61 |
c.Assert(l[29], checker.Equals, uint8('Z'))
|
| ... | ... |
@@ -1,20 +1,13 @@ |
| 1 |
-// Package jsonlog provides helper functions to parse and print time (time.Time) as JSON. |
|
| 2 | 1 |
package jsonlog |
| 3 | 2 |
|
| 4 | 3 |
import ( |
| 5 |
- "errors" |
|
| 6 | 4 |
"time" |
| 7 |
-) |
|
| 8 | 5 |
|
| 9 |
-const ( |
|
| 10 |
- // RFC3339NanoFixed is our own version of RFC339Nano because we want one |
|
| 11 |
- // that pads the nano seconds part with zeros to ensure |
|
| 12 |
- // the timestamps are aligned in the logs. |
|
| 13 |
- RFC3339NanoFixed = "2006-01-02T15:04:05.000000000Z07:00" |
|
| 14 |
- // JSONFormat is the format used by FastMarshalJSON |
|
| 15 |
- JSONFormat = `"` + time.RFC3339Nano + `"` |
|
| 6 |
+ "github.com/pkg/errors" |
|
| 16 | 7 |
) |
| 17 | 8 |
|
| 9 |
+const jsonFormat = `"` + time.RFC3339Nano + `"` |
|
| 10 |
+ |
|
| 18 | 11 |
// FastTimeMarshalJSON avoids one of the extra allocations that |
| 19 | 12 |
// time.MarshalJSON is making. |
| 20 | 13 |
func FastTimeMarshalJSON(t time.Time) (string, error) {
|
| ... | ... |
@@ -23,5 +16,5 @@ func FastTimeMarshalJSON(t time.Time) (string, error) {
|
| 23 | 23 |
// See golang.org/issue/4556#c15 for more discussion. |
| 24 | 24 |
return "", errors.New("time.MarshalJSON: year outside of range [0,9999]")
|
| 25 | 25 |
} |
| 26 |
- return t.Format(JSONFormat), nil |
|
| 26 |
+ return t.Format(jsonFormat), nil |
|
| 27 | 27 |
} |
| ... | ... |
@@ -9,11 +9,14 @@ import ( |
| 9 | 9 |
"time" |
| 10 | 10 |
|
| 11 | 11 |
gotty "github.com/Nvveen/Gotty" |
| 12 |
- "github.com/docker/docker/pkg/jsonlog" |
|
| 13 | 12 |
"github.com/docker/docker/pkg/term" |
| 14 | 13 |
units "github.com/docker/go-units" |
| 15 | 14 |
) |
| 16 | 15 |
|
| 16 |
+// RFC3339NanoFixed is time.RFC3339Nano with nanoseconds padded using zeros to |
|
| 17 |
+// ensure the formatted time isalways the same number of characters. |
|
| 18 |
+const RFC3339NanoFixed = "2006-01-02T15:04:05.000000000Z07:00" |
|
| 19 |
+ |
|
| 17 | 20 |
// JSONError wraps a concrete Code and Message, `Code` is |
| 18 | 21 |
// is an integer error code, `Message` is the error message. |
| 19 | 22 |
type JSONError struct {
|
| ... | ... |
@@ -199,9 +202,9 @@ func (jm *JSONMessage) Display(out io.Writer, termInfo termInfo) error {
|
| 199 | 199 |
return nil |
| 200 | 200 |
} |
| 201 | 201 |
if jm.TimeNano != 0 {
|
| 202 |
- fmt.Fprintf(out, "%s ", time.Unix(0, jm.TimeNano).Format(jsonlog.RFC3339NanoFixed)) |
|
| 202 |
+ fmt.Fprintf(out, "%s ", time.Unix(0, jm.TimeNano).Format(RFC3339NanoFixed)) |
|
| 203 | 203 |
} else if jm.Time != 0 {
|
| 204 |
- fmt.Fprintf(out, "%s ", time.Unix(jm.Time, 0).Format(jsonlog.RFC3339NanoFixed)) |
|
| 204 |
+ fmt.Fprintf(out, "%s ", time.Unix(jm.Time, 0).Format(RFC3339NanoFixed)) |
|
| 205 | 205 |
} |
| 206 | 206 |
if jm.ID != "" {
|
| 207 | 207 |
fmt.Fprintf(out, "%s: ", jm.ID) |
| ... | ... |
@@ -8,7 +8,6 @@ import ( |
| 8 | 8 |
"testing" |
| 9 | 9 |
"time" |
| 10 | 10 |
|
| 11 |
- "github.com/docker/docker/pkg/jsonlog" |
|
| 12 | 11 |
"github.com/docker/docker/pkg/term" |
| 13 | 12 |
"github.com/stretchr/testify/assert" |
| 14 | 13 |
) |
| ... | ... |
@@ -115,8 +114,8 @@ func TestJSONMessageDisplay(t *testing.T) {
|
| 115 | 115 |
From: "From", |
| 116 | 116 |
Status: "status", |
| 117 | 117 |
}: {
|
| 118 |
- fmt.Sprintf("%v ID: (from From) status\n", time.Unix(now.Unix(), 0).Format(jsonlog.RFC3339NanoFixed)),
|
|
| 119 |
- fmt.Sprintf("%v ID: (from From) status\n", time.Unix(now.Unix(), 0).Format(jsonlog.RFC3339NanoFixed)),
|
|
| 118 |
+ fmt.Sprintf("%v ID: (from From) status\n", time.Unix(now.Unix(), 0).Format(RFC3339NanoFixed)),
|
|
| 119 |
+ fmt.Sprintf("%v ID: (from From) status\n", time.Unix(now.Unix(), 0).Format(RFC3339NanoFixed)),
|
|
| 120 | 120 |
}, |
| 121 | 121 |
// General, with nano precision time |
| 122 | 122 |
{
|
| ... | ... |
@@ -125,8 +124,8 @@ func TestJSONMessageDisplay(t *testing.T) {
|
| 125 | 125 |
From: "From", |
| 126 | 126 |
Status: "status", |
| 127 | 127 |
}: {
|
| 128 |
- fmt.Sprintf("%v ID: (from From) status\n", time.Unix(0, now.UnixNano()).Format(jsonlog.RFC3339NanoFixed)),
|
|
| 129 |
- fmt.Sprintf("%v ID: (from From) status\n", time.Unix(0, now.UnixNano()).Format(jsonlog.RFC3339NanoFixed)),
|
|
| 128 |
+ fmt.Sprintf("%v ID: (from From) status\n", time.Unix(0, now.UnixNano()).Format(RFC3339NanoFixed)),
|
|
| 129 |
+ fmt.Sprintf("%v ID: (from From) status\n", time.Unix(0, now.UnixNano()).Format(RFC3339NanoFixed)),
|
|
| 130 | 130 |
}, |
| 131 | 131 |
// General, with both times Nano is preferred |
| 132 | 132 |
{
|
| ... | ... |
@@ -136,8 +135,8 @@ func TestJSONMessageDisplay(t *testing.T) {
|
| 136 | 136 |
From: "From", |
| 137 | 137 |
Status: "status", |
| 138 | 138 |
}: {
|
| 139 |
- fmt.Sprintf("%v ID: (from From) status\n", time.Unix(0, now.UnixNano()).Format(jsonlog.RFC3339NanoFixed)),
|
|
| 140 |
- fmt.Sprintf("%v ID: (from From) status\n", time.Unix(0, now.UnixNano()).Format(jsonlog.RFC3339NanoFixed)),
|
|
| 139 |
+ fmt.Sprintf("%v ID: (from From) status\n", time.Unix(0, now.UnixNano()).Format(RFC3339NanoFixed)),
|
|
| 140 |
+ fmt.Sprintf("%v ID: (from From) status\n", time.Unix(0, now.UnixNano()).Format(RFC3339NanoFixed)),
|
|
| 141 | 141 |
}, |
| 142 | 142 |
// Stream over status |
| 143 | 143 |
{
|