@@ -5,25 +5,25 @@ import (
55 "errors"
66 "log"
77 "net"
8- "os"
9- "strings"
10- "strconv"
11- "text/template"
8+ "os"
9+ "strings"
10+ "strconv"
11+ "text/template"
1212
1313
1414 "github.com/gliderlabs/logspout/router"
15- "github.com/gliderlabs/logspout/adapters/syslog"
15+ "github.com/gliderlabs/logspout/adapters/syslog"
1616)
1717
1818var 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}}" ,
2727}
2828
2929func init () {
@@ -39,10 +39,10 @@ func getopt(name string) string {
3939}
4040
4141type JSONAdapter struct {
42- conn net.Conn
42+ conn net.Conn
4343 route * router.Route
44- tmpl * template.Template
45- types map [string ]string
44+ tmpl * template.Template
45+ types map [string ]string
4646}
4747
4848func NewJSONAdapter (route * router.Route ) (router.LogAdapter , error ) {
@@ -55,35 +55,35 @@ func NewJSONAdapter(route *router.Route) (router.LogAdapter, error) {
5555 return nil , err
5656 }
5757
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 )
7171 if err != nil {
7272 return nil , err
7373 }
7474
7575 return & JSONAdapter {
7676 route : route ,
77- conn : conn ,
78- tmpl : tmpl ,
79- types : types ,
77+ conn : conn ,
78+ tmpl : tmpl ,
79+ types : types ,
8080 }, nil
8181}
8282
8383func (a * JSONAdapter ) Stream (logstream chan * router.Message ) {
84- defer a .route .Close ()
84+ defer a .route .Close ()
8585 for message := range logstream {
86- m := syslog .NewSyslogMessage (message , a .conn )
86+ m := syslog .NewSyslogMessage (message , a .conn )
8787 buf , err := m .Render (a .tmpl )
8888 if err != nil {
8989 log .Println ("json:" , err )
@@ -103,47 +103,47 @@ func (a *JSONAdapter) Stream(logstream chan *router.Message) {
103103}
104104
105105func 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
149149}
0 commit comments