[Pywikipedia-l] SVN: [6388] branches/rewrite/pywikibot/bot.py
russblau at svn.wikimedia.org
russblau at svn.wikimedia.org
Fri Feb 20 14:36:25 UTC 2009
Revision: 6388
Author: russblau
Date: 2009-02-20 14:36:24 +0000 (Fri, 20 Feb 2009)
Log Message:
-----------
Initialize logging handlers if output() is called before handleArgs()
Modified Paths:
--------------
branches/rewrite/pywikibot/bot.py
Modified: branches/rewrite/pywikibot/bot.py
===================================================================
--- branches/rewrite/pywikibot/bot.py 2009-02-20 14:25:13 UTC (rev 6387)
+++ branches/rewrite/pywikibot/bot.py 2009-02-20 14:36:24 UTC (rev 6388)
@@ -130,6 +130,11 @@
implemented)
"""
+ # make sure logging system has been initialized
+ root = pywikibot.logging.getLogger()
+ if root.level == 30: # init_handlers sets this level
+ init_handlers()
+
if decoder:
text = unicode(text, decoder)
elif type(text) is not unicode:
@@ -186,6 +191,89 @@
return data
+def init_handlers():
+ """Initialize logging system for terminal-based bots"""
+
+ # All user output is routed through the logging module.
+ # Each type of output is handled by an appropriate handler object.
+ # This structure is used to permit eventual development of other
+ # user interfaces (GUIs) without modifying the core bot code.
+ # The following output levels are defined:
+ # DEBUG - only for file logging; debugging messages
+ # STDOUT - output that must be sent to sys.stdout (for bots that may
+ # have their output redirected to a file or other destination)
+ # VERBOSE - optional progress information for display to user
+ # INFO - normal (non-optional) progress information for display to user
+ # INPUT - prompts requiring user response
+ # WARN - user warning messages
+ # ERROR - user error messages
+ # CRITICAL - fatal error messages
+ # Accordingly, do ''not'' use print statements in bot code; instead,
+ # use pywikibot.output function.
+
+ moduleName = calledModuleName()
+ if not moduleName:
+ moduleName = "terminal-interface"
+
+ logging.addLevelName(VERBOSE, "VERBOSE")
+ # for messages to be displayed on terminal at "verbose" setting
+ # use INFO for messages to be displayed even on non-verbose setting
+ logging.addLevelName(STDOUT, "STDOUT")
+ # for messages to be displayed to stdout
+ logging.addLevelName(INPUT, "INPUT")
+ # for prompts requiring user response
+
+ root_logger = logging.getLogger()
+ root_logger.handlers = [] # get rid of default handler
+ root_logger.setLevel(DEBUG+1) # all records except DEBUG go to logger
+
+ # configure default handler for VERBOSE and INFO levels
+ default_handler = TerminalHandler(strm=sys.stderr)
+ if config.verbose_output:
+ default_handler.setLevel(VERBOSE)
+ else:
+ default_handler.setLevel(INFO)
+ default_handler.addFilter(MaxLevelFilter(INPUT))
+ default_handler.setFormatter(logging.Formatter(fmt="%(message)s"))
+ root_logger.addHandler(default_handler)
+
+ # if user has enabled file logging, configure file handler
+ if moduleName in config.log or '*' in config.log:
+ if config.logfilename:
+ logfile = config.datafilepath(config.logfilename)
+ else:
+ logfile = config.datafilepath("%s-bot.log" % moduleName)
+ file_handler = logging.handlers.RotatingFileHandler(
+ filename=logfile, maxBytes=2 << 20, backupCount=5)
+
+ file_handler.setLevel(DEBUG)
+ form = logging.Formatter(
+ fmt="%(asctime)s %(filename)18s, %(lineno)d: "
+ "%(levelname)-8s %(message)s",
+ datefmt="%Y-%m-%d %H:%M:%S"
+ )
+ file_handler.setFormatter(form)
+ root_logger.addHandler(file_handler)
+ for component in config.debug_log:
+ debuglogger = logging.getLogger(component)
+ debuglogger.setLevel(DEBUG)
+ debuglogger.addHandler(file_handler)
+
+ # handler for level STDOUT
+ output_handler = TerminalHandler(strm=sys.stdout)
+ output_handler.setLevel(STDOUT)
+ output_handler.addFilter(MaxLevelFilter(STDOUT))
+ output_handler.setFormatter(logging.Formatter(fmt="%(message)s"))
+ root_logger.addHandler(output_handler)
+
+ # handler for levels WARNING and higher
+ warning_handler = TerminalHandler(strm=sys.stderr)
+ warning_handler.setLevel(logging.WARNING)
+ warning_handler.setFormatter(
+ logging.Formatter(fmt="%(levelname)s: %(message)s"))
+ root_logger.addHandler(warning_handler)
+
+
# Command line parsing and help
def calledModuleName():
@@ -294,84 +382,9 @@
if username:
config.usernames[config.family][config.mylang] = username
- # initialize logging system for terminal-based bots
+ init_handlers()
- # All user output is routed through the logging module.
- # Each type of output is handled by an appropriate handler object.
- # This structure is used to permit eventual development of other
- # user interfaces (GUIs) without modifying the core bot code.
- # The following output levels are defined:
- # DEBUG - only for file logging; debugging messages
- # STDOUT - output that must be sent to sys.stdout (for bots that may
- # have their output redirected to a file or other destination)
- # VERBOSE - optional progress information for display to user
- # INFO - normal (non-optional) progress information for display to user
- # INPUT - prompts requiring user response
- # WARN - user warning messages
- # ERROR - user error messages
- # CRITICAL - fatal error messages
- # Accordingly, do ''not'' use print statements in bot code; instead,
- # use pywikibot.output function.
-
- logging.addLevelName(VERBOSE, "VERBOSE")
- # for messages to be displayed on terminal at "verbose" setting
- # use INFO for messages to be displayed even on non-verbose setting
- logging.addLevelName(STDOUT, "STDOUT")
- # for messages to be displayed to stdout
- logging.addLevelName(INPUT, "INPUT")
- # for prompts requiring user response
-
- root_logger = logging.getLogger()
- root_logger.handlers = [] # get rid of default handler
- root_logger.setLevel(DEBUG+1) # all records except DEBUG go to logger
-
- # configure default handler for VERBOSE and INFO levels
- default_handler = TerminalHandler(strm=sys.stderr)
if config.verbose_output:
- default_handler.setLevel(VERBOSE)
- else:
- default_handler.setLevel(INFO)
- default_handler.addFilter(MaxLevelFilter(INPUT))
- default_handler.setFormatter(logging.Formatter(fmt="%(message)s"))
- root_logger.addHandler(default_handler)
-
- # if user has enabled file logging, configure file handler
- if moduleName in config.log or '*' in config.log:
- if config.logfilename:
- logfile = config.datafilepath(config.logfilename)
- else:
- logfile = config.datafilepath("%s-bot.log" % moduleName)
- file_handler = logging.handlers.RotatingFileHandler(
- filename=logfile, maxBytes=2 << 20, backupCount=5)
-
- file_handler.setLevel(DEBUG)
- form = logging.Formatter(
- fmt="%(asctime)s %(filename)18s, %(lineno)d: "
- "%(levelname)-8s %(message)s",
- datefmt="%Y-%m-%d %H:%M:%S"
- )
- file_handler.setFormatter(form)
- root_logger.addHandler(file_handler)
- for component in config.debug_log:
- debuglogger = logging.getLogger(component)
- debuglogger.setLevel(DEBUG)
- debuglogger.addHandler(file_handler)
-
- # handler for level STDOUT
- output_handler = TerminalHandler(strm=sys.stdout)
- output_handler.setLevel(STDOUT)
- output_handler.addFilter(MaxLevelFilter(STDOUT))
- output_handler.setFormatter(logging.Formatter(fmt="%(message)s"))
- root_logger.addHandler(output_handler)
-
- # handler for levels WARNING and higher
- warning_handler = TerminalHandler(strm=sys.stderr)
- warning_handler.setLevel(logging.WARNING)
- warning_handler.setFormatter(
- logging.Formatter(fmt="%(levelname)s: %(message)s"))
- root_logger.addHandler(warning_handler)
-
- if config.verbose_output:
import re
ver = pywikibot.__version__ # probably can be improved on
m = re.search(r"\$Id: .* (\d+ \d+-\d+-\d+ \d+:\d+:\d+Z) .*\$", ver)
More information about the Pywikipedia-l
mailing list