@@ -5,25 +5,25 @@ import (
5
5
"errors"
6
6
"log"
7
7
"net"
8
- "os"
9
- "strings"
10
- "strconv"
11
- "text/template"
8
+ "os"
9
+ "strings"
10
+ "strconv"
11
+ "text/template"
12
12
13
13
14
14
"github.com/gliderlabs/logspout/router"
15
- "github.com/gliderlabs/logspout/adapters/syslog"
15
+ "github.com/gliderlabs/logspout/adapters/syslog"
16
16
)
17
17
18
18
var configDefaults = map [string ]string {
19
- "JSON_FIELDS" : "time:uint,message,docker.hostname,docker.image" ,
20
- "JSON_TIME" : "{{.Time.Unix}}" ,
21
- "JSON_MESSAGE" : "{{.Data}}" ,
22
- "JSON_SOURCE" : "{{.Source}}" ,
23
- "JSON_DOCKER_HOSTNAME" : "{{.Container.Config.Hostname}}" ,
24
- "JSON_DOCKER_IMAGE" : "{{.Container.Config.Image}}" ,
25
- "JSON_DOCKER_ID" : "{{.Container.ID}}" ,
26
- "JSON_DOCKER_NAME" : "{{.ContainerName}}" ,
19
+ "JSON_FIELDS" : "time:uint,message,docker.hostname,docker.image" ,
20
+ "JSON_TIME" : "{{.Time.Unix}}" ,
21
+ "JSON_MESSAGE" : "{{.Data}}" ,
22
+ "JSON_SOURCE" : "{{.Source}}" ,
23
+ "JSON_DOCKER_HOSTNAME" : "{{.Container.Config.Hostname}}" ,
24
+ "JSON_DOCKER_IMAGE" : "{{.Container.Config.Image}}" ,
25
+ "JSON_DOCKER_ID" : "{{.Container.ID}}" ,
26
+ "JSON_DOCKER_NAME" : "{{.ContainerName}}" ,
27
27
}
28
28
29
29
func init () {
@@ -39,10 +39,10 @@ func getopt(name string) string {
39
39
}
40
40
41
41
type JSONAdapter struct {
42
- conn net.Conn
42
+ conn net.Conn
43
43
route * router.Route
44
- tmpl * template.Template
45
- types map [string ]string
44
+ tmpl * template.Template
45
+ types map [string ]string
46
46
}
47
47
48
48
func NewJSONAdapter (route * router.Route ) (router.LogAdapter , error ) {
@@ -55,35 +55,35 @@ func NewJSONAdapter(route *router.Route) (router.LogAdapter, error) {
55
55
return nil , err
56
56
}
57
57
58
- fields := strings .Split (getopt ("JSON_FIELDS" ), "," )
59
- types := make (map [string ]string )
60
- var values []string
61
- for _ , field := range fields {
62
- parts := strings .Split (field , ":" )
63
- if len (parts ) > 1 {
64
- types [parts [0 ]] = parts [1 ]
65
- }
66
- config := "JSON_" + strings .ToUpper (strings .Replace (parts [0 ], "." , "_" , - 1 ))
67
- values = append (values , parts [0 ] + ":" + getopt (config ))
68
- }
69
- tmplStr := strings .Join (values , "\x00 " )
70
- tmpl , err := template .New ("prejson" ).Parse (tmplStr )
58
+ fields := strings .Split (getopt ("JSON_FIELDS" ), "," )
59
+ types := make (map [string ]string )
60
+ var values []string
61
+ for _ , field := range fields {
62
+ parts := strings .Split (field , ":" )
63
+ if len (parts ) > 1 {
64
+ types [parts [0 ]] = parts [1 ]
65
+ }
66
+ config := "JSON_" + strings .ToUpper (strings .Replace (parts [0 ], "." , "_" , - 1 ))
67
+ values = append (values , parts [0 ] + ":" + getopt (config ))
68
+ }
69
+ tmplStr := strings .Join (values , "\x00 " )
70
+ tmpl , err := template .New ("prejson" ).Parse (tmplStr )
71
71
if err != nil {
72
72
return nil , err
73
73
}
74
74
75
75
return & JSONAdapter {
76
76
route : route ,
77
- conn : conn ,
78
- tmpl : tmpl ,
79
- types : types ,
77
+ conn : conn ,
78
+ tmpl : tmpl ,
79
+ types : types ,
80
80
}, nil
81
81
}
82
82
83
83
func (a * JSONAdapter ) Stream (logstream chan * router.Message ) {
84
- defer a .route .Close ()
84
+ defer a .route .Close ()
85
85
for message := range logstream {
86
- m := syslog .NewSyslogMessage (message , a .conn )
86
+ m := syslog .NewSyslogMessage (message , a .conn )
87
87
buf , err := m .Render (a .tmpl )
88
88
if err != nil {
89
89
log .Println ("json:" , err )
@@ -103,47 +103,47 @@ func (a *JSONAdapter) Stream(logstream chan *router.Message) {
103
103
}
104
104
105
105
func buildMap (input string , types map [string ]string ) map [string ]interface {} {
106
- m := make (map [string ]interface {})
107
- fields := strings .Split (input , "\x00 " )
108
- for _ , field := range fields {
109
- kvp := strings .SplitN (field , ":" , 2 )
110
- keys := strings .Split (kvp [0 ], "." )
111
- mm := m
112
- if len (keys ) > 1 {
113
- for _ , key := range keys [:len (keys )- 1 ] {
114
- if mm [key ] == nil {
115
- mm [key ] = make (map [string ]interface {})
116
- }
117
- mm = mm [key ].(map [string ]interface {})
118
- }
119
- }
120
- var value interface {}
121
- var err error
122
- switch types [field ] {
123
- case "uint" :
124
- value , err = strconv .ParseUint (kvp [1 ], 10 , 64 )
125
- if err != nil {
126
- value = nil
127
- }
128
- case "int" :
129
- value , err = strconv .ParseInt (kvp [1 ], 10 , 64 )
130
- if err != nil {
131
- value = nil
132
- }
133
- case "float" :
134
- value , err = strconv .ParseFloat (kvp [1 ], 64 )
135
- if err != nil {
136
- value = nil
137
- }
138
- case "bool" :
139
- value , err = strconv .ParseBool (kvp [1 ])
140
- if err != nil {
141
- value = nil
142
- }
143
- case "" :
144
- value = kvp [1 ]
145
- }
146
- mm [keys [len (keys )- 1 ]] = value
147
- }
148
- return m
106
+ m := make (map [string ]interface {})
107
+ fields := strings .Split (input , "\x00 " )
108
+ for _ , field := range fields {
109
+ kvp := strings .SplitN (field , ":" , 2 )
110
+ keys := strings .Split (kvp [0 ], "." )
111
+ mm := m
112
+ if len (keys ) > 1 {
113
+ for _ , key := range keys [:len (keys )- 1 ] {
114
+ if mm [key ] == nil {
115
+ mm [key ] = make (map [string ]interface {})
116
+ }
117
+ mm = mm [key ].(map [string ]interface {})
118
+ }
119
+ }
120
+ var value interface {}
121
+ var err error
122
+ switch types [field ] {
123
+ case "uint" :
124
+ value , err = strconv .ParseUint (kvp [1 ], 10 , 64 )
125
+ if err != nil {
126
+ value = nil
127
+ }
128
+ case "int" :
129
+ value , err = strconv .ParseInt (kvp [1 ], 10 , 64 )
130
+ if err != nil {
131
+ value = nil
132
+ }
133
+ case "float" :
134
+ value , err = strconv .ParseFloat (kvp [1 ], 64 )
135
+ if err != nil {
136
+ value = nil
137
+ }
138
+ case "bool" :
139
+ value , err = strconv .ParseBool (kvp [1 ])
140
+ if err != nil {
141
+ value = nil
142
+ }
143
+ case "" :
144
+ value = kvp [1 ]
145
+ }
146
+ mm [keys [len (keys )- 1 ]] = value
147
+ }
148
+ return m
149
149
}
0 commit comments