Skip to content

Instantly share code, notes, and snippets.

@hintjens
Created June 16, 2011 20:46
Show Gist options
  • Save hintjens/1030232 to your computer and use it in GitHub Desktop.
Save hintjens/1030232 to your computer and use it in GitHub Desktop.
Patch to log major events to syslog
From 606fb49dca15fcc44f9018f30415c13abaa2251f Mon Sep 17 00:00:00 2001
From: Pieter Hintjens <[email protected]>
Date: Thu, 17 Feb 2011 16:23:01 +0100
Subject: [PATCH 149/149] Added syslog reporting of some major events in 0MQ
- log method in object base class sends formatted report to sys://log.
- xrep warns when it cannot route a message due to an unknown envelope identity
- session warns when it disconnects a peer due to duplicate identity
Signed-off-by: Pieter Hintjens <[email protected]>
---
src/object.cpp | 30 ++++++++++++++++++++++++++++--
src/object.hpp | 4 ++--
src/session.cpp | 1 +
src/xrep.cpp | 2 ++
4 files changed, 33 insertions(+), 4 deletions(-)
diff --git a/src/object.cpp b/src/object.cpp
index 9ec73f7..c597712 100644
--- a/src/object.cpp
+++ b/src/object.cpp
@@ -151,9 +151,35 @@ void zmq::object_t::destroy_socket (socket_base_t *socket_)
ctx->destroy_socket (socket_);
}
-void zmq::object_t::log (zmq_msg_t *msg_)
-{
- ctx->log (msg_);
+// Sends the string to sys://log, and if the identity is not null
+// reports that as a readable string.
+//
+void zmq::object_t::log (const char *string_, const blob_t &identity_)
+{
+ // We log errors in 0MQ string format, with trailing null byte
+ // First four characters of string are error identifier
+ // We discard duplicates to avoid error message storms
+ ::zmq_msg_t msg;
+ std::string report = "";
+
+ report += string_;
+ if (&identity_) {
+ report += " (identity = 0x";
+ for (uint i = 0; i < identity_.length() && i < 32; i++) {
+ const char hex [] = "0123456789ABCDEF";
+ report += hex [identity_[i] >> 4];
+ report += hex [identity_[i] & 15];
+ }
+ report += ", \"";
+ for (uint i = 0; i < identity_.length() && i < 32; i++)
+ report += isprint (identity_[i])? identity_[i]: '.';
+ report += "\")\0";
+ }
+ // Log the error message
+ zmq_msg_init_size (&msg, report.length ());
+ memcpy (zmq_msg_data (&msg), report.c_str (), report.length ());
+ ctx->log (&msg);
+ zmq_msg_close (&msg);
}
zmq::io_thread_t *zmq::object_t::choose_io_thread (uint64_t affinity_)
diff --git a/src/object.hpp b/src/object.hpp
index 748a339..6186d74 100644
--- a/src/object.hpp
+++ b/src/object.hpp
@@ -51,8 +51,8 @@ namespace zmq
struct endpoint_t find_endpoint (const char *addr_);
void destroy_socket (class socket_base_t *socket_);
- // Logs an message.
- void log (zmq_msg_t *msg_);
+ // Logs a system error string
+ void log (const char *string_, const blob_t &identity_);
// Chooses least loaded I/O thread.
class io_thread_t *choose_io_thread (uint64_t affinity_);
diff --git a/src/session.cpp b/src/session.cpp
index 350d043..fb0cd5a 100644
--- a/src/session.cpp
+++ b/src/session.cpp
@@ -234,6 +234,7 @@ void zmq::session_t::process_attach (i_engine *engine_,
// If the session already has an engine attached, destroy new one.
// Note new engine is not plugged in yet, we don't have to unplug it.
if (engine) {
+ log ("DPID: duplicate peer identity - disconnecting peer", peer_identity_);
delete engine_;
return;
}
diff --git a/src/xrep.cpp b/src/xrep.cpp
index 9c985c0..135630d 100644
--- a/src/xrep.cpp
+++ b/src/xrep.cpp
@@ -178,6 +178,8 @@ int zmq::xrep_t::xsend (zmq_msg_t *msg_, int flags_)
outpipes_t::iterator it = outpipes.find (identity);
if (it != outpipes.end ())
current_out = it->second.writer;
+ else
+ log ("IDNF: no such identity, cannot route message - discarding", identity);
}
int rc = zmq_msg_close (msg_);
--
1.7.0.4
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment