script/lib/iri_tweet/utils.py
changeset 255 500cd0405c7a
parent 254 2209e66bb50b
child 289 a5eff8f2b81d
--- a/script/lib/iri_tweet/utils.py	Fri Aug 12 18:17:27 2011 +0200
+++ b/script/lib/iri_tweet/utils.py	Wed Aug 17 18:32:07 2011 +0200
@@ -3,10 +3,11 @@
     ACCESS_TOKEN_SECRET, adapt_date, adapt_json, TweetSource, TweetLog, MediaType, 
     Media, EntityMedia, Entity, EntityType)
 from sqlalchemy.sql import select, or_ #@UnresolvedImport
+import Queue #@UnresolvedImport
 import anyjson #@UnresolvedImport
 import datetime
 import email.utils
-import logging #@UnresolvedImport
+import logging
 import os.path
 import sys
 import twitter.oauth #@UnresolvedImport
@@ -14,7 +15,6 @@
 import twitter_text #@UnresolvedImport
 
 
-
 CACHE_ACCESS_TOKEN = {}
 
 def get_oauth_token(token_file_path=None, check_access_token=True, application_name=APPLICATION_NAME, consumer_key=CONSUMER_KEY, consumer_secret=CONSUMER_SECRET):
@@ -448,7 +448,7 @@
         self.obj_buffer.persists(self.session)
 
 
-def set_logging(options, plogger=None):
+def set_logging(options, plogger=None, queue=None):
     
     logging_config = {
         "format" : '%(asctime)s %(levelname)s:%(name)s:%(message)s',
@@ -466,14 +466,17 @@
     if logger is None:
         logger = get_logger() #@UndefinedVariable
     
-    if len(logger.handlers) == 0:    
+    if len(logger.handlers) == 0:
         filename = logging_config.get("filename")
-        if filename:
+        if queue is not None:
+            hdlr = QueueHandler(queue, True)
+        elif filename:
             mode = logging_config.get("filemode", 'a')
             hdlr = logging.FileHandler(filename, mode) #@UndefinedVariable
         else:
             stream = logging_config.get("stream")
             hdlr = logging.StreamHandler(stream) #@UndefinedVariable
+            
         fs = logging_config.get("format", logging.BASIC_FORMAT) #@UndefinedVariable
         dfs = logging_config.get("datefmt", None)
         fmt = logging.Formatter(fs, dfs) #@UndefinedVariable
@@ -484,6 +487,7 @@
             logger.setLevel(level)
     
     options.debug = (options.verbose-options.quiet > 0)
+    return logger
 
 def set_logging_options(parser):
     parser.add_option("-l", "--log", dest="logfile",
@@ -536,5 +540,47 @@
     
     return query.distinct()
 
+logger_name = "iri.tweet"
+
 def get_logger():
-    return logging.getLogger("iri_tweet") #@UndefinedVariable
+    global logger_name
+    return logging.getLogger(logger_name) #@UndefinedVariable
+
+
+# Next two import lines for this demo only
+
+class QueueHandler(logging.Handler): #@UndefinedVariable
+    """
+    This is a logging handler which sends events to a multiprocessing queue.    
+    """
+
+    def __init__(self, queue, ignore_full):
+        """
+        Initialise an instance, using the passed queue.
+        """
+        logging.Handler.__init__(self) #@UndefinedVariable
+        self.queue = queue
+        self.ignore_full = True
+        
+    def emit(self, record):
+        """
+        Emit a record.
+
+        Writes the LogRecord to the queue.
+        """
+        try:
+            ei = record.exc_info
+            if ei:
+                dummy = self.format(record) # just to get traceback text into record.exc_text
+                record.exc_info = None  # not needed any more
+            if not self.ignore_full or not self.queue.full():
+                self.queue.put_nowait(record)
+        except Queue.Full:
+            if self.ignore_full:
+                pass
+            else:
+                raise
+        except (KeyboardInterrupt, SystemExit):
+            raise
+        except:
+            self.handleError(record)