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

[Xen-changelog] Rewritten XendLogging to not be a singleton class, and not have methods used



# HG changeset patch
# User emellor@ewan
# Node ID d6d1c3cbc151299053d2fafe579ac3cdd34a2195
# Parent  1ac39c7a043541cfa94655f0e9ab98d4503c29a2
Rewritten XendLogging to not be a singleton class, and not have methods used
from nowhere at all.

Log to a temporary file if permission is denied to log to /var/log/xend.log,
as happens when you are not root.  Fixes bug #305.

Remove all the log-related garbage from XendRoot -- just about every module
was going straight to XendLogging.log already, so there was no need to have
XendRoot replicate this functionality.

Remove XendRoot.event_handler, which hasn't been in use since the EventServer
was removed.

Signed-off-by: Ewan Mellor <ewan@xxxxxxxxxxxxx>

diff -r 1ac39c7a0435 -r d6d1c3cbc151 tools/python/xen/xend/XendLogging.py
--- a/tools/python/xen/xend/XendLogging.py      Mon Oct 10 13:46:53 2005
+++ b/tools/python/xen/xend/XendLogging.py      Mon Oct 10 15:15:48 2005
@@ -13,79 +13,82 @@
 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 #============================================================================
 # Copyright (C) 2004, 2005 Mike Wray <mike.wray@xxxxxx>
+# Copyright (C) 2005 XenSource Ltd
 #============================================================================
 
+
+import tempfile
 import types
 import logging
-from logging import Formatter, StreamHandler
-from logging.handlers import RotatingFileHandler
+import logging.handlers
 
-class XendLogging:
 
-    KB = 1024
-    MB = 1024 * KB
-    
-    maxBytes = 1 * MB
-    backupCount = 5
+__all__ = [ 'log', 'init', 'getLogFilename', 'addLogStderr',
+            'removeLogStderr' ]
 
-    logStderrFormat = "[%(name)s] %(levelname)s (%(module)s:%(lineno)d) 
%(message)s"
-    logFileFormat   = "[%(asctime)s %(name)s] %(levelname)s 
(%(module)s:%(lineno)d) %(message)s"
-    dateFormat = "%Y-%m-%d %H:%M:%S"
-
-    def __init__(self, filename, level=logging.INFO, maxBytes=None, 
backupCount=None):
-        """Initialise logging. Logs to 'filename' by default, but does not log 
to
-        stderr unless addLogStderr() is called.
-        """
-        self.setLevel(level)
-        if maxBytes:
-            self.maxBytes = maxBytes
-        if backupCount:
-            self.backupCount = backupCount
-        self.initLogFile(filename)
-        self.initLogStderr()
-
-    def setLevel(self, level):
-        if isinstance(level, types.StringType):
-            level = logging._levelNames[level]
-        self.getLogger().setLevel(level)
-        self.level = level
-
-    def getLogger(self):
-        return logging.getLogger("xend")
-
-    def initLogFile(self, filename):
-        """Create the file logger and add it.
-        """
-        self.logfile = RotatingFileHandler(filename,
-                                           mode='a',
-                                           maxBytes=self.maxBytes,
-                                           backupCount=self.backupCount)
-        self.logfilename = filename
-        self.logfile.setFormatter(Formatter(self.logFileFormat, 
self.dateFormat))
-        self.getLogger().addHandler(self.logfile)
-
-    def getLogFile(self):
-        return self.logfile
-
-    def getLogFilename(self):
-        return self.logfilename
-
-    def initLogStderr(self):
-        """Create the stderr logger, but don't add it.
-        """
-        self.logstderr = StreamHandler()
-        self.logstderr.setFormatter(Formatter(self.logStderrFormat, 
self.dateFormat))
-
-    def addLogStderr(self):
-        """Add logging to stderr."""
-        self.getLogger().addHandler(self.logstderr)
-
-    def removeLogStderr(self):
-        """Remove logging to stderr."""
-        self.getLogger().removeHandler(self.logstderr)
-        
-    def getLogStderr(self):
-        return self.logstderr
 
 log = logging.getLogger("xend")
-    
+
+
+DEFAULT_MAX_BYTES = 1 << 20  # 1MB
+DEFAULT_BACKUP_COUNT = 5
+
+STDERR_FORMAT = "[%(name)s] %(levelname)s (%(module)s:%(lineno)d) %(message)s"
+LOGFILE_FORMAT = "[%(asctime)s %(name)s] %(levelname)s (%(module)s:%(lineno)d) 
%(message)s"
+DATE_FORMAT = "%Y-%m-%d %H:%M:%S"
+
+
+stderrHandler = logging.StreamHandler()
+stderrHandler.setFormatter(logging.Formatter(STDERR_FORMAT, DATE_FORMAT))
+
+logfilename = None
+
+
+def init(filename, level=logging.INFO, maxBytes=None, backupCount=None):
+    """Initialise logging. Logs to 'filename' by default, but does not log to
+    stderr unless addLogStderr() is called.
+    """
+
+    def openFileHandler(fname):
+        return logging.handlers.RotatingFileHandler(fname,
+                                                    mode='a',
+                                                    maxBytes=maxBytes,
+                                                    backupCount=backupCount)
+
+    if not maxBytes:
+        maxBytes = DEFAULT_MAX_BYTES
+    if not backupCount:
+        backupCount = DEFAULT_BACKUP_COUNT
+
+    # Rather unintuitively, getLevelName will get the number corresponding to
+    # a level name, as well as getting the name corresponding to a level
+    # number.  setLevel seems to take the number only though, so convert if we
+    # are given a string.
+    if isinstance(level, types.StringType):
+        level = logging.getLevelName(level)
+
+    log.setLevel(level)
+
+    try:
+        fileHandler = openFileHandler(filename)
+        logfilename = filename
+    except IOError:
+        logfilename = tempfile.mkstemp("-xend.log")[1]
+        fileHandler = openFileHandler(logfilename)
+
+    fileHandler.setFormatter(logging.Formatter(LOGFILE_FORMAT, DATE_FORMAT))
+    log.addHandler(fileHandler)
+
+
+def getLogFilename():
+    return logfilename
+
+
+def addLogStderr():
+    """Add logging to stderr."""
+    log.addHandler(stderrHandler)
+
+
+def removeLogStderr():
+    """Remove logging to stderr."""
+    log.removeHandler(stderrHandler)
diff -r 1ac39c7a0435 -r d6d1c3cbc151 tools/python/xen/xend/XendRoot.py
--- a/tools/python/xen/xend/XendRoot.py Mon Oct 10 13:46:53 2005
+++ b/tools/python/xen/xend/XendRoot.py Mon Oct 10 15:15:48 2005
@@ -13,6 +13,7 @@
 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 #============================================================================
 # Copyright (C) 2004, 2005 Mike Wray <mike.wray@xxxxxx>
+# Copyright (C) 2005 XenSource Ltd
 #============================================================================
 
 """Xend root class.
@@ -29,7 +30,7 @@
 import string
 import sys
 
-from XendLogging import XendLogging
+import XendLogging
 from XendError import XendError
 
 import sxp
@@ -92,7 +93,6 @@
     def __init__(self):
         self.config_path = None
         self.config = None
-        self.logging = None
         self.configure()
 
 
@@ -114,84 +114,22 @@
         """
         return self.components.get(name)
 
-    def _format(self, msg, args):
-        if args:
-            return str(msg) % args
-        else:
-            return str(msg)
-
-    def _log(self, mode, fmt, args):
-        """Logging function that uses the logger if it exists, otherwise
-        logs to stderr. We use this for XendRoot log messages because
-        they may be logged before the logger has been configured.
-        Other components can safely use the logger.
-        """
-        log = self.get_logger()
-        if mode not in ['warning', 'info', 'debug', 'error']:
-            mode = 'info'
-        level = mode.upper()
-        if log:
-            getattr(log, mode)(fmt, *args)
-        else:
-            print >>sys.stderr, "xend", "[%s]" % level, self._format(fmt, args)
-
-    def logDebug(self, fmt, *args):
-        """Log a debug message.
-
-        @param fmt: message format
-        @param args: arguments
-        """
-        self._log('debug', fmt, args)
-        
-    def logInfo(self, fmt, *args):
-        """Log an info message.
-
-        @param fmt: message format
-        @param args: arguments
-        """
-        self._log('info', fmt, args)
-
-    def logWarning(self, fmt, *args):
-        """Log a warning message.
-
-        @param fmt: message format
-        @param args: arguments
-        """
-        self._log('warning', fmt, args)
-        
-    def logError(self, fmt, *args):
-        """Log an error message.
-
-        @param fmt: message format
-        @param args: arguments
-        """
-        self._log('error', fmt, args)
-        
-    def event_handler(self, event, val):
-        self.logInfo("EVENT> %s %s", str(event), str(val))
+    def _logError(self, fmt, args):
+        """Logging function to log to stderr. We use this for XendRoot log
+        messages because they may be logged before the logger has been
+        configured.  Other components can safely use the logger.
+        """
+        print >>sys.stderr, "xend [ERROR]", fmt % args
 
     def configure(self):
         self.set_config()
-        self.configure_logger()
-
-    def configure_logger(self):
         logfile = self.get_config_value("logfile", self.logfile_default)
         loglevel = self.get_config_value("loglevel", self.loglevel_default)
-        self.logging = XendLogging(logfile, level=loglevel)
+        XendLogging.init(logfile, level = loglevel)
 
         from xen.xend.server import params
         if params.XEND_DEBUG:
-            self.logging.addLogStderr()
-
-    def get_logging(self):
-        """Get the XendLogging instance.
-        """
-        return self.logging
-
-    def get_logger(self):
-        """Get the logger.
-        """
-        return self.logging and self.logging.getLogger()
+            XendLogging.addLogStderr()
 
     def set_config(self):
         """If the config file exists, read it. If not, ignore it.
@@ -200,7 +138,6 @@
         """
         self.config_path = os.getenv(self.config_var, self.config_default)
         if os.path.exists(self.config_path):
-            #self.logInfo('Reading config file %s', self.config_path)
             try:
                 fin = file(self.config_path, 'rb')
                 try:
@@ -210,10 +147,12 @@
                 config.insert(0, 'xend-config')
                 self.config = config
             except Exception, ex:
-                self.logError('Reading config file %s: %s', self.config_path, 
str(ex))
+                self._logError('Reading config file %s: %s',
+                               self.config_path, str(ex))
                 raise
         else:
-            self.logError('Config file does not exist: %s', self.config_path)
+            self._logError('Config file does not exist: %s',
+                           self.config_path)
             self.config = ['xend-config']
 
     def get_config(self, name=None):
@@ -339,11 +278,6 @@
         inst = XendRoot()
     return inst
 
-def logger():
-    """Get the logger.
-    """
-    return instance().get_logger()
-
 def add_component(name, val):
     """Register a component with XendRoot.
     This is used to work-round import cycles.
diff -r 1ac39c7a0435 -r d6d1c3cbc151 tools/python/xen/xend/server/SrvXendLog.py
--- a/tools/python/xen/xend/server/SrvXendLog.py        Mon Oct 10 13:46:53 2005
+++ b/tools/python/xen/xend/server/SrvXendLog.py        Mon Oct 10 15:15:48 2005
@@ -13,11 +13,12 @@
 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 #============================================================================
 # Copyright (C) 2004, 2005 Mike Wray <mike.wray@xxxxxx>
+# Copyright (C) 2005 XenSource Ltd
 #============================================================================
 
 from xen.web import static
 
-from xen.xend import XendRoot
+from xen.xend import XendLogging
 
 from xen.web.SrvDir import SrvDir
 
@@ -27,8 +28,8 @@
 
     def __init__(self):
         SrvDir.__init__(self)
-        logging = XendRoot.instance().get_logging()
-        self.logfile = static.File(logging.getLogFilename(), 
defaultType="text/plain")
+        self.logfile = static.File(XendLogging.getLogFilename(),
+                                   defaultType="text/plain")
         self.logfile.type = "text/plain"
         self.logfile.encoding = None
 
diff -r 1ac39c7a0435 -r d6d1c3cbc151 tools/python/xen/xend/server/event.py
--- a/tools/python/xen/xend/server/event.py     Mon Oct 10 13:46:53 2005
+++ b/tools/python/xen/xend/server/event.py     Mon Oct 10 15:15:48 2005
@@ -25,6 +25,7 @@
 from xen.xend import sxp
 from xen.xend import PrettyPrint
 from xen.xend.XendError import XendError
+from xen.xend import XendLogging
 from xen.xend import XendRoot
 
 
@@ -146,11 +147,10 @@
 
     def op_log_stderr(self, _, v):
         mode = v[1]
-        logging = xroot.get_logging()
         if mode == 'on':
-            logging.addLogStderr()
+            XendLogging.addLogStderr()
         else:
-            logging.removeLogStderr()
+            XendLogging.removeLogStderr()
 
     def op_domain_ls(self, _1, _2):
         xd = xroot.get_component("xen.xend.XendDomain")

_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.