Revision: 7858
Author:   russblau
Date:     2010-01-05 20:28:28 +0000 (Tue, 05 Jan 2010)

Log Message:
-----------
Fix for #2618858: logfiles format

Modified Paths:
--------------
    branches/rewrite/pywikibot/bot.py
    branches/rewrite/pywikibot/userinterfaces/terminal_interface.py

Modified: branches/rewrite/pywikibot/bot.py
===================================================================
--- branches/rewrite/pywikibot/bot.py   2010-01-05 17:43:13 UTC (rev 7857)
+++ branches/rewrite/pywikibot/bot.py   2010-01-05 20:28:28 UTC (rev 7858)
@@ -32,6 +32,31 @@
 from pywikibot import config
 
 
+# User interface initialization
+# search for user interface module in the 'userinterfaces' subdirectory
+uiModule = __import__("pywikibot.userinterfaces.%s_interface"
+                        % config.userinterface,
+                        fromlist=['UI'] )
+ui = uiModule.UI()
+
+# next bit filched from 1.5.2's inspect.py
+def currentframe():
+    """Return the frame object for the caller's stack frame."""
+    try:
+        raise Exception
+    except:
+        return sys.exc_traceback.tb_frame.f_back
+
+if hasattr(sys, '_getframe'):
+    # less portable but more efficient
+    currentframe = lambda: sys._getframe(2)
+    # frame0 is this lambda, frame1 is output() in this module,
+    # so frame2 is whatever called output()
+
+# done filching
+
+# Logging module configuration
+
 class MaxLevelFilter(logging.Filter):
     """Filter that only passes records at or below a specific level.
 
@@ -49,14 +74,6 @@
             return True
 
 
-# User interface initialization
-# search for user interface module in the 'userinterfaces' subdirectory
-uiModule = __import__("pywikibot.userinterfaces.%s_interface"
-                        % config.userinterface, 
-                        fromlist=['UI'] )
-ui = uiModule.UI()
-
-
 class RotatingFileHandler(logging.handlers.RotatingFileHandler):
     """Strip trailing newlines before outputting text to file"""
     def format(self, record):
@@ -71,7 +88,7 @@
             * our pywikibot.Error traces are encoded in our
               console encoding, which is needed for plainly printing them.
             * but when it comes to logging using logging.exception,
-              the Python logging module will try to use these traces, 
+              the Python logging module will try to use these traces,
               and it will fail if they are console encoded strings.
 
         Formatter.formatException also strips the trailing \n, which we need.
@@ -112,11 +129,17 @@
     if root.level == 30: # init_handlers sets this level
         init_handlers(strm=ui.output_stream)
 
+    frame = currentframe()
+    module = os.path.basename(frame.f_code.co_filename)
+    context = {'caller_name': frame.f_code.co_name,
+               'caller_file': module,
+               'caller_line': frame.f_lineno}
+
     if decoder:
         text = unicode(text, decoder)
     elif not isinstance(text, unicode):
         if not isinstance(text, str):
-            # looks like text is a non-text object. 
+            # looks like text is a non-text object.
             # Maybe it has a __unicode__ builtin ?
             # (allows to print Page, Site...)
             text = unicode(text)
@@ -129,7 +152,7 @@
         text += "\n"
     if toStdout:
         level = STDOUT
-    ui.output(text, level=level)
+    ui.output(text, level=level, context=context)
 
 def input(question, password=False):
     """Ask the user a question, return the user's answer.
@@ -248,11 +271,11 @@
             logfile = config.datafilepath("%s-bot.log" % moduleName)
         file_handler = RotatingFileHandler(
                             filename=logfile, maxBytes=2 << 20, backupCount=5)
-        
+
         file_handler.setLevel(DEBUG)
         form = LoggingFormatter(
-                   fmt="%(asctime)s %(filename)18s, %(lineno)d: "
-                       "%(levelname)-8s %(message)s",
+                   fmt="%(asctime)s %(caller_file)18s, %(caller_line)4s "
+                       "in %(caller_name)18s: %(levelname)-8s %(message)s",
                    datefmt="%Y-%m-%d %H:%M:%S"
                )
         file_handler.setFormatter(form)
@@ -486,7 +509,7 @@
         """
         Only accepts options defined in availableOptions
         """
-        self.setOptions(**kwargs) 
+        self.setOptions(**kwargs)
 
     def setOptions(self, **kwargs):
         """
@@ -496,7 +519,7 @@
         self.options = {}
 
         validOptions = set(Bot.availableOptions)
-        receivedOptions = set(kwargs) 
+        receivedOptions = set(kwargs)
 
         for opt in receivedOptions & validOptions:
             self.options[opt] = kwargs[opt]
@@ -505,7 +528,7 @@
             pywikibot.output(u'%s is not a valid option. It was ignored\n'
                               % opt,
                              level=pywikibot.WARNING)
-        
+
     def getOption(self, option):
         """
         Get the current value of an option.
@@ -542,7 +565,7 @@
             if choice == 'a':
                 # Remember the choice
                 self.options['always'] = True
-        
+
         if choice != 'n':
             page.put(newtext, async=(choice=='a'))
 

Modified: branches/rewrite/pywikibot/userinterfaces/terminal_interface.py
===================================================================
--- branches/rewrite/pywikibot/userinterfaces/terminal_interface.py     
2010-01-05 17:43:13 UTC (rev 7857)
+++ branches/rewrite/pywikibot/userinterfaces/terminal_interface.py     
2010-01-05 20:28:28 UTC (rev 7858)
@@ -120,7 +120,7 @@
         self.OutputHandlerClass = TerminalHandler
         self.output_stream = sys.stderr
 
-    def output(self, text, level=logging.INFO):
+    def output(self, text, level=logging.INFO, context=None):
         """
         If a character can't be displayed in the encoding used by the user's
         terminal, it will be replaced with a question mark or by a
@@ -128,7 +128,7 @@
         """
         self.writelock.acquire()
         try:
-            logging.getLogger("pywiki").log(level, text)
+            logging.getLogger("pywiki").log(level, text, extra=context)
         finally:
             self.writelock.release()
 
@@ -144,7 +144,7 @@
         if config.ring_bell:
             sys.stdout.write('\07')
 
-        # While we're waiting for user input, 
+        # While we're waiting for user input,
         # we don't want terminal writes from other Threads
         self.writelock.acquire()
         self.output(question + ' ', level=pywikibot.INPUT)
@@ -177,17 +177,17 @@
                 options[i] = '%s[%s]%s' % (option[:pos], caseHotkey, 
option[pos+1:])
             else:
                 options[i] = '%s [%s]' % (option, caseHotkey)
-        
+
         answer = ''
 
-        # While we're waiting for user input, 
+        # While we're waiting for user input,
         # we don't want terminal writes from other Threads
         self.writelock.acquire()
         try:
             # loop until the user entered a valid choice
             while True:
                 prompt = '%s (%s)' % (question, ', '.join(options))
-                
+
                 # it's okay to enter input with the lock, RLock is reentrant.
                 answer = self.input(prompt)
                 if answer.lower() in hotkeys or answer.upper() in hotkeys:
@@ -202,7 +202,7 @@
     def editText(self, text, jumpIndex = None, highlight = None):
         """
         Uses a Tkinter edit box because we don't have a console editor
-        
+
         Parameters:
             * text      - a Unicode string
             * jumpIndex - an integer: position at which to put the caret
@@ -347,7 +347,7 @@
             # Note: A transliteration replacement might be longer than the
             # original character; e.g., ч is transliterated to ch.
             # the resulting list will have as many elements as there are
-            # characters in the original text, but some list elements may 
+            # characters in the original text, but some list elements may
             # contain multiple characters
             prev = "-"
             prevchar = -1



_______________________________________________
Pywikipedia-svn mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/pywikipedia-svn

Reply via email to