From 98204d147a599a273e4ab0a85caab8f8287affb3 Mon Sep 17 00:00:00 2001 From: "Ira W. Snyder" Date: Mon, 1 Jan 2007 13:33:04 -0800 Subject: [PATCH] [LOGGER] Switch to built-in logging class Switch from the homegrown RarslaveLogger class to the built-in logging class. Convert all code that used RarslaveLogger to use the logging class, and remove the RarslaveLogger class completely. Signed-off-by: Ira W. Snyder --- PAR2Set.py | 23 +++++----- PAR2Set_EXTRACTFIRST.py | 9 ++-- PAR2Set_JOIN.py | 3 +- RarslaveCommon.py | 20 ++------- RarslaveDetector.py | 16 ++++--- RarslaveLogger.py | 95 ----------------------------------------- rarslave.py | 82 ++++++++++++++++++----------------- 7 files changed, 75 insertions(+), 173 deletions(-) delete mode 100644 RarslaveLogger.py diff --git a/PAR2Set.py b/PAR2Set.py index 323fc24..e58cc16 100644 --- a/PAR2Set.py +++ b/PAR2Set.py @@ -7,6 +7,7 @@ import Par2Parser import re import os +import logging # This is a fairly generic class which does all of the major things that a PAR2 # set will need to have done to be verified and extracted. For most "normal" types @@ -87,7 +88,7 @@ class PAR2Set (object): # check the result if ret != 0: - fatalMessage ('PAR2 Check / Repair failed: %s' % self.p2file) + logging.critical ('PAR2 Check / Repair failed: %s' % self.p2file) return -ECHECK return SUCCESS @@ -123,9 +124,9 @@ class PAR2Set (object): for f in files: try: os.remove (os.path.join (dir, f)) - debugMessage ('Deleteing: %s' % os.path.join (dir, f)) + logging.debug ('Deleteing: %s' % os.path.join (dir, f)) except: - fatalMessage ('Failed to delete: %s' % os.path.join (dir, f)) + logging.error ('Failed to delete: %s' % os.path.join (dir, f)) return -EDELETE return SUCCESS @@ -143,7 +144,7 @@ class PAR2Set (object): ret = self.runVerifyAndRepair () if ret != SUCCESS: - fatalMessage ('Repair stage failed for: %s' % self.p2file) + logging.critical ('Repair stage failed for: %s' % self.p2file) return -ECHECK self.update_matches () @@ -152,7 +153,7 @@ class PAR2Set (object): ret = self.runExtract () if ret != SUCCESS: - fatalMessage ('Extraction stage failed for: %s' % self.p2file) + logging.critical ('Extraction stage failed for: %s' % self.p2file) return -EEXTRACT self.update_matches () @@ -161,10 +162,10 @@ class PAR2Set (object): ret = self.runDelete () if ret != SUCCESS: - fatalMessage ('Deletion stage failed for: %s' % self.p2file) + logging.critical ('Deletion stage failed for: %s' % self.p2file) return -EDELETE - normalMessage ('Successfully completed: %s' % self.p2file) + logging.info ('Successfully completed: %s' % self.p2file) return SUCCESS def safe_create_directory (self, dir): @@ -176,9 +177,9 @@ class PAR2Set (object): try: os.makedirs (dir) - verboseMessage ('Created directory: %s' % dir) + logging.info ('Created directory: %s' % dir) except OSError: - fatalMessage ('FAILED to create directory: %s' % dir) + logging.critical ('FAILED to create directory: %s' % dir) return -ECREATE return SUCCESS @@ -200,11 +201,11 @@ class PAR2Set (object): for h in self.find_extraction_heads (): full_head = full_abspath (os.path.join (self.dir, h)) ret = self.extraction_function (full_head, todir) - debugMessage ('Extraction Function returned: %d' % ret) + logging.debug ('Extraction Function returned: %d' % ret) # Check error code if ret != SUCCESS: - fatalMessage ('Failed extracting: %s' % h) + logging.critical ('Failed extracting: %s' % h) return -EEXTRACT return SUCCESS diff --git a/PAR2Set_EXTRACTFIRST.py b/PAR2Set_EXTRACTFIRST.py index ab4b1f6..dbd1749 100644 --- a/PAR2Set_EXTRACTFIRST.py +++ b/PAR2Set_EXTRACTFIRST.py @@ -1,6 +1,7 @@ #!/usr/bin/env python # vim: set ts=4 sts=4 sw=4 textwidth=92: +import logging import PAR2Set from RarslaveCommon import * @@ -28,7 +29,7 @@ class PAR2Set_EXTRACTFIRST (PAR2Set.PAR2Set): ret = self.runExtract () if ret != SUCCESS: - fatalMessage ('Extraction stage failed for: %s' % self.p2file) + logging.critical ('Extraction stage failed for: %s' % self.p2file) return -EEXTRACT self.update_matches () @@ -37,7 +38,7 @@ class PAR2Set_EXTRACTFIRST (PAR2Set.PAR2Set): ret = self.runVerifyAndRepair () if ret != SUCCESS: - fatalMessage ('Repair stage failed for: %s' % self.p2file) + logging.critical ('Repair stage failed for: %s' % self.p2file) return -ECHECK self.update_matches () @@ -46,9 +47,9 @@ class PAR2Set_EXTRACTFIRST (PAR2Set.PAR2Set): ret = self.runDelete () if ret != SUCCESS: - fatalMessage ('Deletion stage failed for: %s' % self.p2file) + logging.critical ('Deletion stage failed for: %s' % self.p2file) return -EDELETE - normalMessage ('Successfully completed: %s' % self.p2file) + logging.info ('Successfully completed: %s' % self.p2file) return SUCCESS diff --git a/PAR2Set_JOIN.py b/PAR2Set_JOIN.py index 3381e72..bf0dc56 100644 --- a/PAR2Set_JOIN.py +++ b/PAR2Set_JOIN.py @@ -1,6 +1,7 @@ #!/usr/bin/env python # vim: set ts=4 sts=4 sw=4 textwidth=92: +import logging import PAR2Set from RarslaveCommon import * @@ -51,7 +52,7 @@ class PAR2Set_JOIN (PAR2Set.PAR2Set): # check the result if ret != 0: - fatalMessage ('PAR2 Check / Repair failed: %s' % self.p2file) + logging.critical ('PAR2 Check / Repair failed: %s' % self.p2file) return -ECHECK return SUCCESS diff --git a/RarslaveCommon.py b/RarslaveCommon.py index 1ed864c..8ffac91 100644 --- a/RarslaveCommon.py +++ b/RarslaveCommon.py @@ -9,9 +9,9 @@ __license__ = "GNU GPL v2 (or, at your option, any later version)" import os import re +import logging import RarslaveGlobals -import RarslaveLogger import Par2Parser # Global constants @@ -93,11 +93,11 @@ def parse_all_par2 (dir, p2head, p2files): files = Par2Parser.get_protected_files (dir, f) done = True except (EnvironmentError, OSError, OverflowError): - verboseMessage ('Corrupt PAR2 file: %s' % f) + logging.warning ('Corrupt PAR2 file: %s' % f) # Now that we're out of the loop, check if we really finished if not done: - fatalMessage ('All PAR2 files corrupt for: %s' % p2head) + logging.critical ('All PAR2 files corrupt for: %s' % p2head) # Return whatever we've got, empty or not return files @@ -130,20 +130,6 @@ def list_eq (l1, l2): return True -# Convience functions for the logger - -def fatalMessage (msg): - RarslaveGlobals.logger.addMessage (msg, RarslaveLogger.MessageType.Fatal) - -def normalMessage (msg): - RarslaveGlobals.logger.addMessage (msg, RarslaveLogger.MessageType.Normal) - -def verboseMessage (msg): - RarslaveGlobals.logger.addMessage (msg, RarslaveLogger.MessageType.Verbose) - -def debugMessage (msg): - RarslaveGlobals.logger.addMessage (msg, RarslaveLogger.MessageType.Debug) - # Convience functions for the config def config_get_value (section, name): diff --git a/RarslaveDetector.py b/RarslaveDetector.py index 85316ca..9f14261 100644 --- a/RarslaveDetector.py +++ b/RarslaveDetector.py @@ -11,6 +11,8 @@ import PAR2Set_NEWRAR import PAR2Set_EF_OLDRAR import PAR2Set_EF_NEWRAR +import logging + class RarslaveDetector (object): # A tuple of tuples with the following definition: @@ -53,7 +55,7 @@ class RarslaveDetector (object): p2set = classname (self.dir, self.p2file) detected = True - debugMessage ('Detected type: %s' % p2set) + logging.debug ('Detected type: %s' % p2set) # Try to have rarslave do it's thing ret = p2set.runAll () @@ -63,19 +65,19 @@ class RarslaveDetector (object): if ret == SUCCESS: break else: - fatalMessage ('Detected type failed for: %s' % self.p2file) + logging.error ('Detected type failed for: %s' % self.p2file) # Make sure we detected at least one valid type if not detected: - fatalMessage ('Unable to determine type: %s' % self.p2file) - verboseMessage ('The following information will help in writing a detector:') - verboseMessage ('name_matches: %s' % self.name_matched_files) - verboseMessage ('prot_matches: %s' % self.prot_matched_files) + logging.warning ('Unable to determine type: %s' % self.p2file) + logging.debug ('The following information will help in writing a detector:') + logging.debug ('name_matches: %s' % self.name_matched_files) + logging.debug ('prot_matches: %s' % self.prot_matched_files) return -EDETECT # Make sure that something worked if ret != SUCCESS: - fatalMessage ('All types failed for: %s' % self.p2file) + logging.critical ('All types failed for: %s' % self.p2file) return ret diff --git a/RarslaveLogger.py b/RarslaveLogger.py deleted file mode 100644 index ae39913..0000000 --- a/RarslaveLogger.py +++ /dev/null @@ -1,95 +0,0 @@ -#!/usr/bin/env python -# vim: set ts=4 sts=4 sw=4 textwidth=92: - -class MessageType (object): - Fatal = -1 - Normal = 0 - Verbose = 1 - Debug = 2 - -class RarslaveMessage (object): - - # Instance Variables: - # ========================================================================== - # msg -- The message to be printed - # type -- The type of message (Fatal, Normal, Verbose, or Debug) - - def __init__ (self, msg, type=MessageType.Normal): - self.msg = msg - self.type = type - - def __repr__ (self): - return "%s" % self.msg - - def isFatal (self): - return self.type == MessageType.Fatal - - def isNormal (self): - return self.type == MessageType.Normal - - def isVerbose (self): - return self.type == MessageType.Verbose - - def isDebug (self): - return self.type == MessageType.Debug - -class RarslaveLogger (object): - # This class will log multiple messages, one for each set that is operated on. - # It will then be able to print all of them out. - - # Instance Variables: - # ========================================================================== - # __messages -- The list of RarslaveMessage()s to be printed later. - - def __init__ (self): - self.__messages = [] - - def addMessage (self, msg, type=MessageType.Normal): - self.__messages.append (RarslaveMessage (msg, type)) - - def hasFatalMessages (self): - for m in self.__messages: - if m.isFatal (): - return True - - return False - - def hasNormalMessages (self): - for m in self.__messages: - if m.isNormal (): - return True - - return False - - def hasVerboseMessages (self): - for m in self.__messages: - if m.isVerbose (): - return True - - return False - - def hasDebugMessages (self): - for m in self.__messages: - if m.isDebug (): - return True - - return False - - def printAllMessages (self, level=MessageType.Normal): - # Print all messages with level upto and including $level. - for m in self.__messages: - if m.type <= level: - print m - - def printLoglevel (self, level=MessageType.Normal): - # Print all message with exactly the loglevel given - for m in self.__messages: - if m.type == level: - print m - -def main (): - pass - -if __name__ == '__main__': - main () - diff --git a/rarslave.py b/rarslave.py index 3f7ee54..a18e6a3 100644 --- a/rarslave.py +++ b/rarslave.py @@ -4,8 +4,7 @@ VERSION="2.0.0" PROGRAM="rarslave2" -import os, sys, optparse -import RarslaveLogger +import os, sys, optparse, logging import RarslaveDetector import RarslaveGlobals from RarslaveCommon import * @@ -13,7 +12,29 @@ from RarslaveCommon import * # Global options from the RarslaveGlobals class options = RarslaveGlobals.options config = RarslaveGlobals.config -logger = RarslaveGlobals.logger + +# A tiny class to hold logging output until we're finished +class DelayedLogger (object): + def __init__ (self, output=sys.stdout.write): + self.__messages = [] + self.__output = output + + def write (self, msg): + self.__messages.append (msg) + + def flush (self): + pass + + def size (self): + """Returns the number of messages queued for printing""" + return len (self.__messages) + + def close (self): + """Print all messages, clear the queue""" + for m in self.__messages: + self.__output (m) + + self.__messages = [] # A tiny class used to find unique PAR2 sets class CompareSet (object): @@ -117,45 +138,28 @@ def find_loglevel (options): loglevel = options.verbose - options.quiet - if loglevel < RarslaveLogger.MessageType.Fatal: - loglevel = RarslaveLogger.MessageType.Fatal - - if loglevel > RarslaveLogger.MessageType.Debug: - loglevel = RarslaveLogger.MessageType.Debug - - return loglevel + if loglevel > 1: + loglevel = 1 -def printMessageTable (loglevel): + if loglevel < -3: + loglevel = -3 - if logger.hasFatalMessages (): - print '\nFatal Messages\n' + '=' * 80 - logger.printLoglevel (RarslaveLogger.MessageType.Fatal) + LEVELS = { 1 : logging.DEBUG, + 0 : logging.INFO, + -1: logging.WARNING, + -2: logging.ERROR, + -3: logging.CRITICAL + } - if loglevel == RarslaveLogger.MessageType.Fatal: - return - - if logger.hasNormalMessages (): - print '\nNormal Messages\n' + '=' * 80 - logger.printLoglevel (RarslaveLogger.MessageType.Normal) - - if loglevel == RarslaveLogger.MessageType.Normal: - return - - if logger.hasVerboseMessages (): - print '\nVerbose Messages\n' + '=' * 80 - logger.printLoglevel (RarslaveLogger.MessageType.Verbose) - - if loglevel == RarslaveLogger.MessageType.Verbose: - return - - if logger.hasDebugMessages (): - print '\nDebug Messages\n' + '=' * 80 - logger.printLoglevel (RarslaveLogger.MessageType.Debug) - - return + return LEVELS [loglevel] def main (): + # Setup the logger + logger = DelayedLogger () + logging.basicConfig (stream=logger, level=logging.WARNING, \ + format='%(levelname)-8s %(message)s') + # Build the OptionParser parser = optparse.OptionParser() parser.add_option('-n', '--not-recursive', @@ -210,7 +214,7 @@ def main (): run_options (options) # Find the loglevel using the options given - loglevel = find_loglevel (options) + logging.getLogger().setLevel (find_loglevel (options)) # Run recursively if options.recursive: @@ -228,7 +232,9 @@ def main (): ret = detector.runMatchingTypes () # Print the results - printMessageTable (loglevel) + if logger.size () > 0: + print 'Log\n' + '=' * 80 + logger.close () # Done! return 0 -- 2.25.1