From: Ben Pfaff Date: Tue, 17 Nov 2009 00:55:35 +0000 (-0800) Subject: jsonrpc: Add logging for messages sent and received, at DBG level. X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;ds=sidebyside;h=1fd13cde12973420d573af8d161c612a9203b1cd;hp=aa78de9dcb0cdd34cc57358fe236c563006eeb74;p=openvswitch jsonrpc: Add logging for messages sent and received, at DBG level. This made it much easier to see problems while developing some ovsdb-server features. --- diff --git a/lib/dynamic-string.c b/lib/dynamic-string.c index 531e53bb..527dee8a 100644 --- a/lib/dynamic-string.c +++ b/lib/dynamic-string.c @@ -115,6 +115,13 @@ ds_put_cstr(struct ds *ds, const char *s) memcpy(ds_put_uninit(ds, s_len), s, s_len); } +void +ds_put_and_free_cstr(struct ds *ds, char *s) +{ + ds_put_cstr(ds, s); + free(s); +} + void ds_put_format(struct ds *ds, const char *format, ...) { diff --git a/lib/dynamic-string.h b/lib/dynamic-string.h index 01b93c4e..136cedc9 100644 --- a/lib/dynamic-string.h +++ b/lib/dynamic-string.h @@ -44,6 +44,7 @@ void ds_put_utf8(struct ds *, int uc); void ds_put_char_multiple(struct ds *, char, size_t n); void ds_put_buffer(struct ds *, const char *, size_t n); void ds_put_cstr(struct ds *, const char *); +void ds_put_and_free_cstr(struct ds *, char *); void ds_put_format(struct ds *, const char *, ...) PRINTF_FORMAT(2, 3); void ds_put_format_valist(struct ds *, const char *, va_list) PRINTF_FORMAT(2, 0); diff --git a/lib/jsonrpc.c b/lib/jsonrpc.c index d298f0d5..09c3d45d 100644 --- a/lib/jsonrpc.c +++ b/lib/jsonrpc.c @@ -21,6 +21,7 @@ #include #include "byteq.h" +#include "dynamic-string.h" #include "json.h" #include "list.h" #include "ofpbuf.h" @@ -133,6 +134,37 @@ jsonrpc_get_name(const struct jsonrpc *rpc) return rpc->name; } +static void +jsonrpc_log_msg(const struct jsonrpc *rpc, const char *title, + const struct jsonrpc_msg *msg) +{ + if (VLOG_IS_DBG_ENABLED()) { + struct ds s = DS_EMPTY_INITIALIZER; + if (msg->method) { + ds_put_format(&s, ", method=\"%s\"", msg->method); + } + if (msg->params) { + ds_put_cstr(&s, ", params="); + ds_put_and_free_cstr(&s, json_to_string(msg->params, 0)); + } + if (msg->result) { + ds_put_cstr(&s, ", result="); + ds_put_and_free_cstr(&s, json_to_string(msg->result, 0)); + } + if (msg->error) { + ds_put_cstr(&s, ", error="); + ds_put_and_free_cstr(&s, json_to_string(msg->error, 0)); + } + if (msg->id) { + ds_put_cstr(&s, ", id="); + ds_put_and_free_cstr(&s, json_to_string(msg->id, 0)); + } + VLOG_DBG("%s: %s %s%s", rpc->name, title, + jsonrpc_msg_type_to_string(msg->type), ds_cstr(&s)); + ds_destroy(&s); + } +} + int jsonrpc_send(struct jsonrpc *rpc, struct jsonrpc_msg *msg) { @@ -146,6 +178,8 @@ jsonrpc_send(struct jsonrpc *rpc, struct jsonrpc_msg *msg) return rpc->status; } + jsonrpc_log_msg(rpc, "send", msg); + json = jsonrpc_msg_to_json(msg); s = json_to_string(json, 0); length = strlen(s); @@ -313,6 +347,7 @@ jsonrpc_received(struct jsonrpc *rpc) return; } + jsonrpc_log_msg(rpc, "received", msg); rpc->received = msg; }