[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]

Re: pungi logger




I just looked at this again and I don't think it'll quite work. The thing is I want logging to work if somebody just imported pypungi and started using commands. Maybe that's not possible, maybe it is. Something to look into. I think I can have a pypungi.logger module/class that has some reasonable defaults that can be overridden if the config file is used, or if say /usr/bin/pungi is envoked, but would work otherwise.

------------------------------------------------------------------------

--
Fedora-buildsys-list mailing list
Fedora-buildsys-list redhat com
https://www.redhat.com/mailman/listinfo/fedora-buildsys-list
This one can also be considered...
This solution activates logging as soon as the pypungi module is imported and puts it in the __builtin__ namespace as "Plog" (I called it "Plog" instead of "log" to give it a 'pungi' feel :). This allows the user to use "Plog" from that poing on without having to do anything else. The behavior of the "Plog" can be changed by calling on the pypungi.pungiLogO object and specifying the values that need to be changed. I did a small test run and everything seems OK. Jesse: I think this is close to what you mentioned on the previous mail and can be considered for inclusion.
The diff is attached.

--
Joel Andres Granados

diff -ur -x .hg pungi/pungi pungi_l/pungi
--- pungi/pungi	2007-05-28 14:54:05.000000000 +0200
+++ pungi_l/pungi	2007-05-29 13:59:49.000000000 +0200
@@ -83,6 +83,15 @@
 
     destdir = config.get('default', 'destdir')
 
+    if not config.has_option('default', 'quiet'):logF=True
+    else:logF=False
+    config.set('default','quiet',str(not logF))
+    
+    # change logging defaults. 
+    logPath = os.path.join(config.get('default', 'destdir'), 
+        'logs/%s.%s.log' % (config.get('default', 'flavor'), config.get('default', 'arch')))
+    pypungi.pungiLogO.changeDefaults(logPath=logPath, logF=logF)
+
     if not os.path.exists(destdir):
         try:
             os.makedirs(destdir)
diff -ur -x .hg pungi/pypungi/gather.py pungi_l/pypungi/gather.py
--- pungi/pypungi/gather.py	2007-05-28 12:49:57.000000000 +0200
+++ pungi_l/pypungi/gather.py	2007-05-29 13:49:41.000000000 +0200
@@ -49,7 +49,6 @@
         #self.doSackSetup(arches)
         self.doSackSetup(archlist=arches) # work around temp break in yum api
         self.doSackFilelistPopulate()
-        self.logger = yum.logging.getLogger("yum.verbose.pungi")
         self.pkglist = pkglist
         self.polist = []
         self.srpmlist = []
@@ -59,15 +58,8 @@
         self.compsobj.add(self.config.get('default', 'comps'))
 
     def doLoggingSetup(self, debuglevel, errorlevel):
-        """Setup the logging facility."""
-
-
-        logdir = os.path.join(self.config.get('default', 'destdir'), 'logs')
-        if not os.path.exists(logdir):
-            os.makedirs(logdir)
-        logfile = os.path.join(logdir, '%s.%s.log' % (self.config.get('default', 'flavor'),
-                                                      self.config.get('default', 'arch')))
-        yum.logging.basicConfig(level=yum.logging.DEBUG, filename=logfile)
+        # We want to use our own logger.
+        pass
 
     def doFileLogSetup(self, uid, logfile):
         # This function overrides a yum function, allowing pungi to control
@@ -95,8 +87,7 @@
            transaction info"""
 
 
-        if not self.config.has_option('default', 'quiet'):
-            self.logger.info('Checking deps of %s.%s' % (po.name, po.arch))
+        Plog.info('Checking deps of %s.%s' % (po.name, po.arch))
 
         reqs = po.requires
         provs = po.provides
@@ -112,13 +103,12 @@
 
             deps = self.whatProvides(r, f, v).returnPackages()
             if deps is None:
-                self.logger.warning("Unresolvable dependency %s in %s.%s" % (r, po.name, po.arch))
+                Plog.warning("Unresolvable dependency %s in %s.%s" % (r, po.name, po.arch))
                 continue
 
             for dep in deps:
                 self.tsInfo.addInstall(dep)
-                if not self.config.has_option('default', 'quiet'):
-                    self.logger.info('Added %s.%s for %s.%s' % (dep.name, dep.arch, po.name, po.arch))
+                Plog.info('Added %s.%s for %s.%s' % (dep.name, dep.arch, po.name, po.arch))
            
             self.resolved_deps[req] = None
 
@@ -143,7 +133,7 @@
 
         # Check if we have the group
         if not self.compsobj.has_group(group):
-            self.logger.error("Group %s not found in comps!" % group)
+            Plog.error("Group %s not found in comps!" % group)
             return packages
 
         # Get the group object to work with
@@ -194,22 +184,18 @@
         for line in self.pkglist:
             line = line.strip()
             if line.startswith('#'):
-                if not self.config.has_option('default', 'quiet'):
-                    self.logger.info('Skipping comment: %s' % line)
+                Plog.info('Skipping comment: %s' % line)
                 continue
             if line.startswith('@'):
-                if not self.config.has_option('default', 'quiet'):
-                    self.logger.info('Adding group: %s' % line)
+                Plog.info('Adding group: %s' % line)
                 grouplist.append(line.strip('@'))
                 continue
             if line.startswith('-'):
-                if not self.config.has_option('default', 'quiet'):
-                    self.logger.info('Adding exclude: %s' % line)
+                Plog.info('Adding exclude: %s' % line)
                 excludelist.append(line.strip('-'))
                 continue
             else:
-                if not self.config.has_option('default', 'quiet'):
-                    self.logger.info('Adding package: %s' % line)
+                Plog.info('Adding package: %s' % line)
                 addlist.append(line)
 
         # First remove the excludes
@@ -238,12 +224,10 @@
         mysack = yum.packageSack.ListPackageSack(matches)
         for match in mysack.returnNewestByNameArch():
             self.tsInfo.addInstall(match)
-            if not self.config.has_option('default', 'quiet'):
-                self.logger.info('Found %s.%s' % (match.name, match.arch))
+            Plog.info('Found %s.%s' % (match.name, match.arch))
 
         for pkg in unmatched:
-            if not pkg in matchdict.keys():
-                self.logger.warn('Could not find a match for %s' % pkg)
+            Plog.warn('Could not find a match for %s' % pkg)
 
         if len(self.tsInfo) == 0:
             raise yum.Errors.MiscError, 'No packages found to download.'
@@ -281,7 +265,7 @@
             for pkg in self.polist:
                 downloads.append('%s.%s' % (pkg.name, pkg.arch))
                 downloads.sort()
-            self.logger.info("Download list: %s" % downloads)
+            Plog.info("Download list: %s" % downloads)
 
         # Package location within destdir, name subject to change/config
         pkgdir = os.path.join(self.config.get('default', 'destdir'), self.config.get('default', 'version'), 
@@ -300,8 +284,7 @@
             local = os.path.join(self.config.get('default', 'cachedir'), local)
             if os.path.exists(local) and self.verifyCachePkg(pkg, local):
 
-                if not self.config.has_option('default', 'quiet'):
-                    self.logger.info("%s already exists and appears to be complete" % local)
+                Plog.info("%s already exists and appears to be complete" % local)
                 target = os.path.join(pkgdir, os.path.basename(remote))
                 if os.path.exists(target):
                     os.remove(target) # avoid traceback after interrupted download
@@ -310,8 +293,7 @@
 
             # Disable cache otherwise things won't download
             repo.cache = 0
-            if not self.config.has_option('default', 'quiet'):
-                self.logger.info('Downloading %s' % os.path.basename(remote))
+            Plog.info('Downloading %s' % os.path.basename(remote))
             pkg.localpath = local # Hack: to set the localpath to what we want.
 
             # do a little dance for file:// repos...
@@ -365,20 +347,17 @@
             local = os.path.basename(remote)
             local = os.path.join(self.config.get('default', 'cachedir'), local)
             if os.path.exists(local) and self.verifyCachePkg(pkg, local):
-
-                if not self.config.has_option('default', 'quiet'):
-                    self.logger.info("%s already exists and appears to be complete" % local)
-                if os.path.exists(os.path.join(pkgdir, os.path.basename(remote))) and self.verifyCachePkg(pkg, os.path.join(pkgdir, os.path.basename(remote))) == pkg.packagesize:
-                    if not self.config.has_option('default', 'quiet'):
-                        self.logger.info("%s already exists in tree and appears to be complete" % local)
+                Plog.info("%s already exists and appears to be complete" % local)
+                if os.path.exists(os.path.join(pkgdir, os.path.basename(remote))) and \
+                        self.verifyCachePkg(pkg, os.path.join(pkgdir, os.path.basename(remote))) == pkg.packagesize:
+                    Plog.info("%s already exists in tree and appears to be complete" % local)
                 else:
                     os.link(local, os.path.join(pkgdir, os.path.basename(remote)))
                 continue
 
             # Disable cache otherwise things won't download
             repo.cache = 0
-            if not self.config.has_option('default', 'quiet'):
-                self.logger.info('Downloading %s' % os.path.basename(remote))
+            Plog.info('Downloading %s' % os.path.basename(remote))
             pkg.localpath = local # Hack: to set the localpath to what we want.
 
             # do a little dance for file:// repos...
diff -ur -x .hg pungi/pypungi/__init__.py pungi_l/pypungi/__init__.py
--- pungi/pypungi/__init__.py	2007-05-28 12:49:57.000000000 +0200
+++ pungi_l/pypungi/__init__.py	2007-05-29 13:28:07.000000000 +0200
@@ -0,0 +1,69 @@
+#!/usr/bin/python -tt
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; version 2 of the License.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU Library General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+#
+
+
+import logging
+import os.path
+import os
+import __builtin__
+
+class PungiLog:
+    """Class to manage the pungi log
+    
+    Once the pypungi module is imported the class is initialized with default values.
+    The user can use it just by typing Plog.####("message").  This will automatically
+    log stuff to the default file.
+    If the user wants to change the defaults he must call the pypungi.pungiLogO.chengeDefaults.
+    """
+
+    __logPath="/srv/pungi/pungi.log"
+    __logF=True
+    __level=logging.DEBUG
+    def __init__(self, logPath=__logPath, logF=__logF, level=__level):
+        """ Initialize the logger.
+    
+        logPath - is the path to the file.
+        logF - when true log will be activated.
+        level - the level of debuging
+        """
+
+        self.createLogger(logPath, logF, level)
+        __builtin__.Plog = self.log
+
+    def changeDefaults(self, logPath=__logPath, logF=__logF, level=__level):
+        # remove all trace from previous filehandler.
+        self.log.removeHandler(self.fileHandler)
+        if logPath != self.__logPath : os.remove(self.__logPath)
+        self.createLogger(logPath, logF, level)
+
+        __builtin__.Plog = self.log
+
+    def createLogger(self, logPath, logF, level):
+        self.log = logging.getLogger("pungi")
+        if logF:
+            if not os.path.exists(os.path.split(logPath)[0]):
+                os.makedirs(os.path.split(logPath)[0])
+            self.fileHandler = logging.FileHandler(logPath)
+            self.fileHandler.setLevel(level)
+            
+            formatter = logging.Formatter('%(name)s-%(levelno)s-%(funcName)s : %(message)s')
+            self.fileHandler.setFormatter(formatter)
+        
+            self.log.addHandler(self.fileHandler) 
+            self.log.setLevel(logging.DEBUG)
+        else:
+            self.log.disabled=1
+ 
+pungiLogO = PungiLog()#Pungi log object
diff -ur -x .hg pungi/pypungi/pungi.py pungi_l/pypungi/pungi.py
--- pungi/pypungi/pungi.py	2007-05-28 12:49:57.000000000 +0200
+++ pungi_l/pypungi/pungi.py	2007-05-29 13:49:39.000000000 +0200
@@ -13,7 +13,6 @@
 # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 
 import subprocess
-import logging
 import os
 import sys
 sys.path.append('/usr/lib/anaconda-runtime')
@@ -21,8 +20,6 @@
 import shutil
 import re
 
-log = logging.getLogger("pypungi.pungi")
-
 class Pungi:
     def __init__(self, config):
         self.config = config
@@ -67,16 +64,16 @@
         """Run a command and log the output.  Error out if we get something on stderr"""
 
 
-        log.info("Running %s" % ' '.join(command))
+        Plog.info("Running %s" % ' '.join(command))
 
         p1 = subprocess.Popen(command, cwd=rundir, stdout=output, stderr=error)
         (out, err) = p1.communicate()
         if p1.returncode != 0:
-            log.error("Got an error from %s" % command[0])
-            log.error(err)
+            Plog.error("Got an error from %s" % command[0])
+            Plog.error(err)
             raise OSError, "Got an error from %s" % command[0]
 
-        log.info(out)
+        Plog.info(out)
 
     def doBuildinstall(self):
         """Run anaconda-runtime's buildinstall on the tree."""
@@ -180,18 +177,18 @@
                         (out, err) = subprocess.Popen(cpio, cwd=docsdir, stdin=p1.stdout, stdout=subprocess.PIPE, 
                             stderr=subprocess.PIPE).communicate()
                     except:
-                        log.error("Got an error from rpm2cpio")
-                        log.error(err)
+                        Plog.error("Got an error from rpm2cpio")
+                        Plog.error(err)
                         raise
 
-                    log.info(out)
+                    Plog.info(out)
 
         # Walk the tree for our files
         for dirpath, dirname, filelist in os.walk(docsdir):
             for filename in filelist:
                 for regex in fileres:
                     if regex.match(filename) and not os.path.exists(os.path.join(self.topdir, filename)):
-                        log.info("Copying release note file %s" % filename)
+                        Plog.info("Copying release note file %s" % filename)
                         shutil.copy(os.path.join(dirpath, filename), os.path.join(self.topdir, filename))
                         self.common_files.append(filename)
 
@@ -200,7 +197,7 @@
             for directory in dirname:
                 for regex in dirres:
                     if regex.match(directory) and not os.path.exists(os.path.join(self.topdir, directory)):
-                        log.info("Copying release note dir %s" % directory)
+                        Plog.info("Copying release note dir %s" % directory)
                         shutil.copytree(os.path.join(dirpath, directory), os.path.join(self.topdir, directory))
         
 
@@ -228,7 +225,7 @@
         #timber.reserve_size =  
 
         output = timber.main()
-        log.info("Output from splittree: %s" % '\n'.join(output))
+        Plog.info("Output from splittree: %s" % '\n'.join(output))
 
     def doSplitSRPMs(self):
         """Use anaconda-runtime's splittree to split the srpms into appropriate
@@ -266,7 +263,7 @@
                                timber.common_files)
 
         timber.splitSRPMS()
-        log.info("splitSRPMS complete")
+        Plog.info("splitSRPMS complete")
 
     def doCreateSplitrepo(self):
         """Create the split metadata for the isos"""
@@ -514,4 +511,4 @@
             if directory.startswith('os-disc') or directory.startswith('SRPM-disc'):
                 shutil.move(os.path.join(self.archdir, directory), os.path.join(self.workdir, directory))
 
-        log.info("CreateIsos is done.")
+        Plog.info("CreateIsos is done.")

[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]