Jelajahi Sumber

Fixed https://github.com/labstack/echo/issues/507

Signed-off-by: Vishal Rana <vr@labstack.com>
Vishal Rana 9 tahun lalu
induk
melakukan
c8e533fc9c
4 mengubah file dengan 40 tambahan dan 23 penghapusan
  1. 6 6
      bytes/bytes.go
  2. 11 11
      bytes/bytes_test.go
  3. 13 2
      log/log.go
  4. 10 4
      log/log_test.go

+ 6 - 6
bytes/bytes.go

@@ -33,13 +33,13 @@ func New() *Bytes {
 
 // Format formats bytes integer to human readable string.
 // For example, 31323 bytes will return 30.59KB.
-func (*Bytes) Format(b int) string {
+func (*Bytes) Format(b int64) string {
 	multiple := ""
 	value := float32(b)
 
 	switch {
 	case b < KB:
-		return strconv.Itoa(b) + "B"
+		return strconv.FormatInt(b, 10) + "B"
 	case b < MB:
 		value /= KB
 		multiple = "KB"
@@ -65,14 +65,14 @@ func (*Bytes) Format(b int) string {
 
 // Parse parses human readable bytes string to bytes integer.
 // For example, 6GB (6G is also valid) will return 6442450944.
-func (*Bytes) Parse(value string) (i int, err error) {
+func (*Bytes) Parse(value string) (i int64, err error) {
 	parts := pattern.FindStringSubmatch(value)
 	if len(parts) < 3 {
 		return 0, fmt.Errorf("error parsing value=%s", value)
 	}
 	bytesString := parts[1]
 	multiple := parts[2]
-	bytes, err := strconv.Atoi(bytesString)
+	bytes, err := strconv.ParseInt(bytesString, 10, 64)
 	if err != nil {
 		return
 	}
@@ -96,11 +96,11 @@ func (*Bytes) Parse(value string) (i int, err error) {
 }
 
 // Format wraps global Bytes's Format function.
-func Format(b int) string {
+func Format(b int64) string {
 	return global.Format(b)
 }
 
 // Parse wraps global Bytes's Parse function.
-func Parse(val string) (int, error) {
+func Parse(val string) (int64, error) {
 	return global.Parse(val)
 }

+ 11 - 11
bytes/bytes_test.go

@@ -36,56 +36,56 @@ func TestBytesParse(t *testing.T) {
 	// B
 	b, err := Parse("515B")
 	if assert.NoError(t, err) {
-		assert.Equal(t, 515, b)
+		assert.Equal(t, int64(515), b)
 	}
 
 	// KB
 	b, err = Parse("12KB")
 	if assert.NoError(t, err) {
-		assert.Equal(t, 12288, b)
+		assert.Equal(t, int64(12288), b)
 	}
 	b, err = Parse("12K")
 	if assert.NoError(t, err) {
-		assert.Equal(t, 12288, b)
+		assert.Equal(t, int64(12288), b)
 	}
 
 	// MB
 	b, err = Parse("2MB")
 	if assert.NoError(t, err) {
-		assert.Equal(t, 2097152, b)
+		assert.Equal(t, int64(2097152), b)
 	}
 	b, err = Parse("2M")
 	if assert.NoError(t, err) {
-		assert.Equal(t, 2097152, b)
+		assert.Equal(t, int64(2097152), b)
 	}
 
 	// GB
 	b, err = Parse("6GB")
 	if assert.NoError(t, err) {
-		assert.Equal(t, 6442450944, b)
+		assert.Equal(t, int64(6442450944), b)
 	}
 	b, err = Parse("6G")
 	if assert.NoError(t, err) {
-		assert.Equal(t, 6442450944, b)
+		assert.Equal(t, int64(6442450944), b)
 	}
 
 	// TB
 	b, err = Parse("5TB")
 	if assert.NoError(t, err) {
-		assert.Equal(t, 5497558138880, b)
+		assert.Equal(t, int64(5497558138880), b)
 	}
 	b, err = Parse("5T")
 	if assert.NoError(t, err) {
-		assert.Equal(t, 5497558138880, b)
+		assert.Equal(t, int64(5497558138880), b)
 	}
 
 	// PB
 	b, err = Parse("9PB")
 	if assert.NoError(t, err) {
-		assert.Equal(t, 10133099161583616, b)
+		assert.Equal(t, int64(10133099161583616), b)
 	}
 	b, err = Parse("9P")
 	if assert.NoError(t, err) {
-		assert.Equal(t, 10133099161583616, b)
+		assert.Equal(t, int64(10133099161583616), b)
 	}
 }

+ 13 - 2
log/log.go

@@ -2,6 +2,7 @@ package log
 
 import (
 	"bytes"
+	"encoding/json"
 	"fmt"
 	"io"
 	"os"
@@ -30,6 +31,8 @@ type (
 		bufferPool sync.Pool
 		mutex      sync.Mutex
 	}
+
+	Fields map[string]interface{}
 )
 
 const (
@@ -43,8 +46,8 @@ const (
 
 var (
 	global        = New("-")
-	defaultFormat = "time=${time_rfc3339}, level=${level}, prefix=${prefix}, file=${short_file}, " +
-		"line=${line}, message=${message}\n"
+	defaultFormat = `{"time":"${time_rfc3339}","level":"${level}","prefix":"${prefix}",` +
+		`"file":"${short_file}","line":"${line}","message":"${message}"}` + "\n"
 )
 
 func New(prefix string) (l *Logger) {
@@ -299,3 +302,11 @@ func (l *Logger) log(v uint8, format string, args ...interface{}) {
 		}
 	}
 }
+
+func JSON(f Fields) string {
+	s, err := json.Marshal(f)
+	if err != nil {
+		panic(err)
+	}
+	return string(s)
+}

+ 10 - 4
log/log_test.go

@@ -33,10 +33,10 @@ func test(l *Logger, t *testing.T) {
 	assert.NotContains(t, b.String(), "debugf")
 	assert.NotContains(t, b.String(), "info")
 	assert.NotContains(t, b.String(), "infof")
-	assert.Contains(t, b.String(), "level=WARN, prefix="+l.prefix)
-	assert.Contains(t, b.String(), "level=WARN, prefix="+l.prefix)
-	assert.Contains(t, b.String(), "level=ERROR, prefix="+l.prefix)
-	assert.Contains(t, b.String(), "level=ERROR, prefix="+l.prefix)
+	assert.Contains(t, b.String(), `"level":"WARN","prefix":"`+l.prefix+`"`)
+	assert.Contains(t, b.String(), `"message":"warn"`)
+	assert.Contains(t, b.String(), `"level":"ERROR","prefix":"`+l.prefix+`"`)
+	assert.Contains(t, b.String(), `"message":"errorf"`)
 }
 
 func TestLog(t *testing.T) {
@@ -98,6 +98,12 @@ func TestFormat(t *testing.T) {
 	assert.Equal(t, "INFO | test", b.String())
 }
 
+func TestJSON(t *testing.T) {
+	Info(JSON(Fields{
+		"foo": "bar",
+	}))
+}
+
 func BenchmarkLog(b *testing.B) {
 	l := New("test")
 	l.SetOutput(new(bytes.Buffer))