WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-changelog

[Xen-changelog] Rewritten XendLogging to not be a singleton class, and n

To: xen-changelog@xxxxxxxxxxxxxxxxxxx
Subject: [Xen-changelog] Rewritten XendLogging to not be a singleton class, and not have methods used
From: Xen patchbot -unstable <patchbot-unstable@xxxxxxxxxxxxxxxxxxx>
Date: Mon, 10 Oct 2005 15:32:11 +0000
Delivery-date: Mon, 10 Oct 2005 15:29:43 +0000
Envelope-to: www-data@xxxxxxxxxxxxxxxxxxx
List-help: <mailto:xen-changelog-request@lists.xensource.com?subject=help>
List-id: BK change log <xen-changelog.lists.xensource.com>
List-post: <mailto:xen-changelog@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.xensource.com?subject=unsubscribe>
Reply-to: xen-devel@xxxxxxxxxxxxxxxxxxx
Sender: xen-changelog-bounces@xxxxxxxxxxxxxxxxxxx
# 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

<Prev in Thread] Current Thread [Next in Thread>
  • [Xen-changelog] Rewritten XendLogging to not be a singleton class, and not have methods used, Xen patchbot -unstable <=