mirror of
https://github.com/golang/go
synced 2024-11-18 19:34:41 -07:00
96e9e165b7
This improves the logging capabilities of the jsonrpc 2 library to always include the method and also an optional elapsed time. This is used to implement an lsp inspector compatible logging mode in the golsp. Change-Id: I2f7ac8b9298c4364b1b89cf6f696b534557ed139 Reviewed-on: https://go-review.googlesource.com/c/146157 Reviewed-by: Rebecca Stambler <rstambler@golang.org>
60 lines
1.9 KiB
Go
60 lines
1.9 KiB
Go
// Copyright 2018 The Go Authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style
|
|
// license that can be found in the LICENSE file.
|
|
|
|
package jsonrpc2
|
|
|
|
import (
|
|
"encoding/json"
|
|
"log"
|
|
"time"
|
|
)
|
|
|
|
// Logger is an option you can pass to NewConn which is invoked for
|
|
// all messages flowing through a Conn.
|
|
// direction indicates if the message being recieved or sent
|
|
// id is the message id, if not set it was a notification
|
|
// elapsed is the time between a call being seen and the response, and is
|
|
// negative for anything that is not a response.
|
|
// method is the method name specified in the message
|
|
// payload is the parameters for a call or notification, and the result for a
|
|
// response
|
|
type Logger = func(direction Direction, id *ID, elapsed time.Duration, method string, payload *json.RawMessage, err *Error)
|
|
|
|
// Direction is used to indicate to a logger whether the logged message was being
|
|
// sent or received.
|
|
type Direction bool
|
|
|
|
const (
|
|
// Send indicates the message is outgoing.
|
|
Send = Direction(true)
|
|
// Receive indicates the message is incoming.
|
|
Receive = Direction(false)
|
|
)
|
|
|
|
func (d Direction) String() string {
|
|
switch d {
|
|
case Send:
|
|
return "send"
|
|
case Receive:
|
|
return "receive"
|
|
default:
|
|
panic("unreachable")
|
|
}
|
|
}
|
|
|
|
// Log is an implementation of Logger that outputs using log.Print
|
|
// It is not used by default, but is provided for easy logging in users code.
|
|
func Log(direction Direction, id *ID, elapsed time.Duration, method string, payload *json.RawMessage, err *Error) {
|
|
switch {
|
|
case err != nil:
|
|
log.Printf("%v failure [%v] %s %v", direction, id, method, err)
|
|
case id == nil:
|
|
log.Printf("%v notification %s %s", direction, method, *payload)
|
|
case elapsed >= 0:
|
|
log.Printf("%v response in %v [%v] %s %s", direction, elapsed, id, method, *payload)
|
|
default:
|
|
log.Printf("%v call [%v] %s %s", direction, id, method, *payload)
|
|
}
|
|
}
|