From 2b2c2a566b496e6601adf59ff9ae6af32f721cf8 Mon Sep 17 00:00:00 2001
From: Zooko O'Whielacronx <zooko@zooko.com>
Date: Tue, 16 Dec 2008 17:38:07 -0700
Subject: [PATCH] util: logging: refactor some common logging behavior into
 mixins

---
 src/allmydata/util/log.py | 36 ++++++++++++++++++++++++++++++++++++
 1 file changed, 36 insertions(+)

diff --git a/src/allmydata/util/log.py b/src/allmydata/util/log.py
index d8fb0786..5c42531e 100644
--- a/src/allmydata/util/log.py
+++ b/src/allmydata/util/log.py
@@ -1,4 +1,6 @@
 
+import nummedobj
+
 from foolscap.logging import log
 from twisted.python import log as tw_log
 
@@ -24,3 +26,37 @@ def err(*args, **kwargs):
     if 'level' not in kwargs:
         kwargs['level'] = log.UNUSUAL
     return log.err(*args, **kwargs)
+
+class LogMixin(object):
+    """ I remember a msg id and a facility and pass them to log.msg() """
+    def __init__(self, facility=None, grandparentmsgid=None):
+        self._facility = facility
+        self._grandparentmsgid = grandparentmsgid
+        self._parentmsgid = None
+
+    def log(self, msg, facility=None, parent=None, *args, **kwargs):
+        if facility is None:
+            facility = self._facility
+        if parent is None:
+            pmsgid = self._parentmsgid
+        if pmsgid is None:
+            pmsgid = self._grandparentmsgid
+        msgid = log.msg(msg, facility=facility, parent=pmsgid, *args, **kwargs)
+        if self._parentmsgid is None:
+            self._parentmsgid = msgid
+        return msgid
+
+class PrefixingLogMixin(nummedobj.NummedObj, LogMixin):
+    """ I prepend a prefix to each msg, which includes my class and instance number as well as
+    a prefix supplied by my subclass. """
+    def __init__(self, facility=None, grandparentmsgid=None, prefix=''):
+        nummedobj.NummedObj.__init__(self)
+        LogMixin.__init__(self, facility, grandparentmsgid)
+
+        if prefix:
+            self._prefix = "%s(%s): " % (self.__repr__(), prefix)
+        else:
+            self._prefix = "%s: " % (self.__repr__(),)
+
+    def log(self, msg, facility=None, parent=None, *args, **kwargs):
+        return LogMixin.log(self, self._prefix + msg, facility, parent, *args, **kwargs)
-- 
2.45.2