[tor-commits] [stem/master] Deduplicating unknown auth type messages

atagar at torproject.org atagar at torproject.org
Mon Jan 2 22:34:23 UTC 2012


commit 4a5586afb64d50c627652c1ead9314596cb0b36c
Author: Damian Johnson <atagar at torproject.org>
Date:   Sun Jan 1 10:24:38 2012 -0800

    Deduplicating unknown auth type messages
    
    There's quite a few log messages that really don't make sense to repeatedly
    log. Adding optinal logging deduplication and applying it to the INFO level
    message about getting an auth method we don't recognize.
---
 stem/connection.py |    3 ++-
 stem/util/log.py   |   25 +++++++++++++++++++++++++
 2 files changed, 27 insertions(+), 1 deletions(-)

diff --git a/stem/connection.py b/stem/connection.py
index 6bd50fd..37578cf 100644
--- a/stem/connection.py
+++ b/stem/connection.py
@@ -794,7 +794,8 @@ class ProtocolInfoResponse(stem.socket.ControlMessage):
             auth_methods.append(AuthMethod.COOKIE)
           else:
             unknown_auth_methods.append(method)
-            log.info("PROTOCOLINFO response had an unrecognized authentication method: %s" % method)
+            message_id = "stem.connection.unknown_auth_%s" % method
+            log.log_once(message_id, log.INFO, "PROTOCOLINFO response had an unrecognized authentication method: %s" % method)
             
             # our auth_methods should have a single AuthMethod.UNKNOWN entry if
             # any unknown authentication methods exist
diff --git a/stem/util/log.py b/stem/util/log.py
index f9efa09..de84ead 100644
--- a/stem/util/log.py
+++ b/stem/util/log.py
@@ -37,6 +37,10 @@ LOG_VALUES = {
 
 LOGGER = logging.getLogger("stem")
 
+# There's some messages that we don't want to log more than once. This set has
+# the messages IDs that we've logged which fall into this category.
+DEDUPLICATION_MESSAGE_IDS = set()
+
 # Adds a default nullhandler for the stem logger, suppressing the 'No handlers
 # could be found for logger "stem"' warning as per...
 # http://docs.python.org/release/3.1.3/library/logging.html#configuring-logging-for-a-library
@@ -81,6 +85,27 @@ def log(runlevel, message):
   if runlevel:
     LOGGER.log(LOG_VALUES[runlevel], message)
 
+def log_once(message_id, runlevel, message):
+  """
+  Logs a message at the given runlevel. If a message with this ID has already
+  been logged then this is a no-op.
+  
+  Arguments:
+    message_id (str)    - unique message identifier to deduplicate on
+    runlevel (Runlevel) - runlevel to log the message at, logging is skipped if
+                          None
+    message (str)       - message to be logged
+  
+  Returns:
+    True if we log the message, False otherwise
+  """
+  
+  if not runlevel or message_id in DEDUPLICATION_MESSAGE_IDS:
+    return False
+  else:
+    DEDUPLICATION_MESSAGE_IDS.add(message_id)
+    log(runlevel, message)
+
 # shorter aliases for logging at a runlevel
 def trace(message):  log(Runlevel.TRACE, message)
 def debug(message):  log(Runlevel.DEBUG, message)





More information about the tor-commits mailing list