From 6053545ad17e5646e439fedf1b08cd0440f8e767 Mon Sep 17 00:00:00 2001 From: s3rj1k Date: Sun, 3 Nov 2019 22:30:34 +0200 Subject: [PATCH] use custom logger for internal logging Signed-off-by: s3rj1k --- conn_opt.go | 21 ++++++++++++--------- handler_with_error.go | 6 ++---- jsonrpc2.go | 9 ++++++--- 3 files changed, 20 insertions(+), 16 deletions(-) diff --git a/conn_opt.go b/conn_opt.go index e6346ba..00c10e7 100644 --- a/conn_opt.go +++ b/conn_opt.go @@ -29,7 +29,7 @@ func OnSend(f func(*Request, *Response)) ConnOpt { // LogMessages causes all messages sent and received on conn to be // logged using the provided logger. -func LogMessages(log Logger) ConnOpt { +func LogMessages(logger Logger) ConnOpt { return func(c *Conn) { // Remember reqs we have received so we can helpfully show the // request method in OnSend for responses. @@ -38,6 +38,9 @@ func LogMessages(log Logger) ConnOpt { reqMethods = map[ID]string{} ) + // Set custom logger from provided input + c.logger = logger + OnRecv(func(req *Request, resp *Response) { switch { case req != nil && resp == nil: @@ -47,9 +50,9 @@ func LogMessages(log Logger) ConnOpt { params, _ := json.Marshal(req.Params) if req.Notif { - log.Printf("--> notif: %s: %s", req.Method, params) + logger.Printf("jsonrpc2: --> notif: %s: %s\n", req.Method, params) } else { - log.Printf("--> request #%s: %s: %s", req.ID, req.Method, params) + logger.Printf("jsonrpc2: --> request #%s: %s: %s\n", req.ID, req.Method, params) } case resp != nil: @@ -62,10 +65,10 @@ func LogMessages(log Logger) ConnOpt { switch { case resp.Result != nil: result, _ := json.Marshal(resp.Result) - log.Printf("--> result #%s: %s: %s", resp.ID, method, result) + logger.Printf("jsonrpc2: --> result #%s: %s: %s\n", resp.ID, method, result) case resp.Error != nil: err, _ := json.Marshal(resp.Error) - log.Printf("--> error #%s: %s: %s", resp.ID, method, err) + logger.Printf("jsonrpc2: --> error #%s: %s: %s\n", resp.ID, method, err) } } })(c) @@ -74,9 +77,9 @@ func LogMessages(log Logger) ConnOpt { case req != nil: params, _ := json.Marshal(req.Params) if req.Notif { - log.Printf("<-- notif: %s: %s", req.Method, params) + logger.Printf("jsonrpc2: <-- notif: %s: %s\n", req.Method, params) } else { - log.Printf("<-- request #%s: %s: %s", req.ID, req.Method, params) + logger.Printf("jsonrpc2: <-- request #%s: %s: %s\n", req.ID, req.Method, params) } case resp != nil: @@ -90,10 +93,10 @@ func LogMessages(log Logger) ConnOpt { if resp.Result != nil { result, _ := json.Marshal(resp.Result) - log.Printf("<-- result #%s: %s: %s", resp.ID, method, result) + logger.Printf("jsonrpc2: <-- result #%s: %s: %s\n", resp.ID, method, result) } else { err, _ := json.Marshal(resp.Error) - log.Printf("<-- error #%s: %s: %s", resp.ID, method, err) + logger.Printf("jsonrpc2: <-- error #%s: %s: %s\n", resp.ID, method, err) } } })(c) diff --git a/handler_with_error.go b/handler_with_error.go index 51d087b..3feaf09 100644 --- a/handler_with_error.go +++ b/handler_with_error.go @@ -2,7 +2,6 @@ package jsonrpc2 import ( "context" - "log" ) // HandlerWithError implements Handler by calling the func for each @@ -11,7 +10,6 @@ func HandlerWithError(handleFunc func(context.Context, *Conn, *Request) (result return &HandlerWithErrorConfigurer{handleFunc: handleFunc} } - // HandlerWithErrorConfigurer is a handler created by HandlerWithError. type HandlerWithErrorConfigurer struct { handleFunc func(context.Context, *Conn, *Request) (result interface{}, err error) @@ -23,7 +21,7 @@ func (h *HandlerWithErrorConfigurer) Handle(ctx context.Context, conn *Conn, req result, err := h.handleFunc(ctx, conn, req) if req.Notif { if err != nil { - log.Printf("jsonrpc2 handler: notification %q handling error: %s", req.Method, err) + conn.logger.Printf("jsonrpc2 handler: notification %q handling error: %s\n", req.Method, err) } return } @@ -43,7 +41,7 @@ func (h *HandlerWithErrorConfigurer) Handle(ctx context.Context, conn *Conn, req if !req.Notif { if err := conn.SendResponse(ctx, resp); err != nil { if err != ErrClosed || !h.suppressErrClosed { - log.Printf("jsonrpc2 handler: sending response %s: %s", resp.ID, err) + conn.logger.Printf("jsonrpc2 handler: sending response %s: %s\n", resp.ID, err) } } } diff --git a/jsonrpc2.go b/jsonrpc2.go index 594f754..4c974b0 100644 --- a/jsonrpc2.go +++ b/jsonrpc2.go @@ -10,6 +10,7 @@ import ( "fmt" "io" "log" + "os" "strconv" "sync" ) @@ -296,6 +297,8 @@ type Conn struct { disconnect chan struct{} + logger Logger + // Set by ConnOpt funcs. onRecv []func(*Request, *Response) onSend []func(*Request, *Response) @@ -320,6 +323,7 @@ func NewConn(ctx context.Context, stream ObjectStream, h Handler, opts ...ConnOp h: h, pending: map[ID]*call{}, disconnect: make(chan struct{}), + logger: log.New(os.Stderr, "", log.LstdFlags), } for _, opt := range opts { if opt == nil { @@ -542,7 +546,7 @@ func (c *Conn) readMessages(ctx context.Context) { switch { case call == nil: - log.Printf("jsonrpc2: ignoring response #%s with no corresponding request", id) + c.logger.Printf("jsonrpc2: ignoring response #%s with no corresponding request\n", id) case resp.Error != nil: call.done <- resp.Error @@ -574,7 +578,7 @@ func (c *Conn) readMessages(ctx context.Context) { c.mu.Unlock() c.sending.Unlock() if err != io.ErrUnexpectedEOF && !closing { - log.Println("jsonrpc2: protocol error:", err) + c.logger.Printf("jsonrpc2: protocol error: %v\n", err) } close(c.disconnect) } @@ -691,4 +695,3 @@ func (v *anyValueWithExplicitNull) UnmarshalJSON(data []byte) error { *v = anyValueWithExplicitNull{} return json.Unmarshal(data, &v.value) } -