44 "crypto/tls"
55 "fmt"
66 "io"
7+ "log"
78 "net"
89 "net/http"
910 "os"
@@ -182,17 +183,17 @@ func (p *proxyApp) handleForward(w http.ResponseWriter, r *http.Request) {
182183 case <- time .Tick (flushTimeout ):
183184 err := rc .Flush ()
184185 if err != nil {
185- p .logger .Error ().Err (err )
186+ p .logger .Error ().Err (err ). Msg ( "Failed flushing buffer" )
186187 return
187188 }
188189 err = rc .SetReadDeadline (time .Now ().Add (readTimeout ))
189190 if err != nil {
190- p .logger .Error ().Err (err )
191+ p .logger .Error ().Err (err ). Msg ( "Failed setting read deadline" )
191192 return
192193 }
193194 err = rc .SetWriteDeadline (time .Now ().Add (writeTimeout ))
194195 if err != nil {
195- p .logger .Error ().Err (err )
196+ p .logger .Error ().Err (err ). Msg ( "Failed setting write deadline" )
196197 return
197198 }
198199 case <- done :
@@ -249,12 +250,14 @@ func (p *proxyApp) handleTunnel(w http.ResponseWriter, r *http.Request) {
249250 if isLocalAddress (r .Host ) {
250251 dstConn , err = net .DialTimeout ("tcp" , r .Host , timeout )
251252 if err != nil {
253+ p .logger .Error ().Err (err ).Msgf ("Failed connecting to %s" , r .Host )
252254 http .Error (w , err .Error (), http .StatusServiceUnavailable )
253255 return
254256 }
255257 } else {
256258 dstConn , err = p .sockDialer .Dial ("tcp" , r .Host )
257259 if err != nil {
260+ p .logger .Error ().Err (err ).Msgf ("Failed connecting to %s" , r .Host )
258261 http .Error (w , err .Error (), http .StatusServiceUnavailable )
259262 return
260263 }
@@ -264,11 +267,13 @@ func (p *proxyApp) handleTunnel(w http.ResponseWriter, r *http.Request) {
264267
265268 hj , ok := w .(http.Hijacker )
266269 if ! ok {
270+ p .logger .Error ().Msg ("webserver doesn't support hijacking" )
267271 http .Error (w , "webserver doesn't support hijacking" , http .StatusInternalServerError )
268272 return
269273 }
270274 srcConn , _ , err := hj .Hijack ()
271275 if err != nil {
276+ p .logger .Error ().Err (err ).Msg ("Failed hijacking src connection" )
272277 http .Error (w , err .Error (), http .StatusInternalServerError )
273278 return
274279 }
@@ -335,12 +340,30 @@ type Config struct {
335340 CertFile string
336341 KeyFile string
337342}
343+ type logWriter struct {
344+ }
345+
346+ func (writer logWriter ) Write (bytes []byte ) (int , error ) {
347+ return fmt .Print (fmt .Sprintf ("%s | ERROR | %s" , time .Now ().Format (time .RFC3339 ), string (bytes )))
348+ }
349+
350+ type jsonLogWriter struct {
351+ }
352+
353+ func (writer jsonLogWriter ) Write (bytes []byte ) (int , error ) {
354+ return fmt .Print (fmt .Sprintf ("{\" level\" :\" error\" ,\" time\" :\" %s\" ,\" message\" :\" %s\" }\n " ,
355+ time .Now ().Format (time .RFC3339 ), strings .TrimRight (string (bytes ), "\n " )))
356+ }
338357
339358func New (conf * Config ) * proxyApp {
340359 var logger zerolog.Logger
341360 if conf .Json {
361+ log .SetFlags (0 )
362+ log .SetOutput (new (jsonLogWriter ))
342363 logger = zerolog .New (os .Stdout ).With ().Timestamp ().Logger ()
343364 } else {
365+ log .SetFlags (0 )
366+ log .SetOutput (new (logWriter ))
344367 output := zerolog.ConsoleWriter {Out : os .Stdout , TimeFormat : time .RFC3339 , NoColor : true }
345368 output .FormatLevel = func (i interface {}) string {
346369 return strings .ToUpper (fmt .Sprintf ("| %-6s|" , i ))
0 commit comments