[CalendarServer-changes] [11379] CalendarServer/trunk

source_changes at macosforge.org source_changes at macosforge.org
Mon Jun 17 17:44:18 PDT 2013


Revision: 11379
          http://trac.calendarserver.org//changeset/11379
Author:   wsanchez at apple.com
Date:     2013-06-17 17:44:18 -0700 (Mon, 17 Jun 2013)
Log Message:
-----------
Move log level management into LogLevelFilteringPredicate.

Modified Paths:
--------------
    CalendarServer/trunk/calendarserver/tap/caldav.py
    CalendarServer/trunk/calendarserver/tools/dkimtool.py
    CalendarServer/trunk/calendarserver/tools/loadaugmentdb.py
    CalendarServer/trunk/calendarserver/tools/resources.py
    CalendarServer/trunk/calendarserver/tools/upgrade.py
    CalendarServer/trunk/contrib/performance/loadtest/test_sim.py
    CalendarServer/trunk/twext/python/log.py
    CalendarServer/trunk/twext/python/test/test_log.py
    CalendarServer/trunk/twistedcaldav/stdconfig.py
    CalendarServer/trunk/twistedcaldav/test/test_cache.py
    CalendarServer/trunk/twistedcaldav/test/test_config.py

Modified: CalendarServer/trunk/calendarserver/tap/caldav.py
===================================================================
--- CalendarServer/trunk/calendarserver/tap/caldav.py	2013-06-17 20:55:09 UTC (rev 11378)
+++ CalendarServer/trunk/calendarserver/tap/caldav.py	2013-06-18 00:44:18 UTC (rev 11379)
@@ -37,32 +37,33 @@
 
 from zope.interface import implements
 
-from twisted.plugin import IPlugin
-
 from twisted.python.log import FileLogObserver, ILogObserver
 from twisted.python.logfile import LogFile
 from twisted.python.usage import Options, UsageError
-
+from twisted.python.util import uidFromString, gidFromString
+from twisted.plugin import IPlugin
 from twisted.internet.defer import gatherResults, Deferred, inlineCallbacks, succeed
-
 from twisted.internet.process import ProcessExitedAlready
 from twisted.internet.protocol import Protocol, Factory
 from twisted.internet.protocol import ProcessProtocol
-
+from twisted.internet.endpoints import UNIXClientEndpoint, TCP4ClientEndpoint
 from twisted.application.internet import TCPServer, UNIXServer
 from twisted.application.service import MultiService, IServiceMaker
 from twisted.application.service import Service
+from twisted.protocols.amp import AMP
 
-from twistedcaldav.config import config, ConfigurationError
-from twistedcaldav.stdconfig import DEFAULT_CONFIG, DEFAULT_CONFIG_FILE
 from twext.web2.server import Site
-from twext.python.log import Logger
-from twext.python.log import LogLevel, logLevelForNamespace, setLogLevelForNamespace
+from twext.python.log import Logger, LogLevel
 from twext.python.filepath import CachingFilePath
 from twext.internet.ssl import ChainingOpenSSLContextFactory
 from twext.internet.tcp import MaxAcceptTCPServer, MaxAcceptSSLServer
 from twext.web2.channel.http import LimitingHTTPFactory, SSLRedirectRequest
 from twext.web2.metafd import ConnectionLimiter, ReportingHTTPService
+from twext.enterprise.ienterprise import POSTGRES_DIALECT
+from twext.enterprise.ienterprise import ORACLE_DIALECT
+from twext.enterprise.adbapi2 import ConnectionPool
+from twext.enterprise.queue import WorkerFactory as QueueWorkerFactory
+from twext.enterprise.queue import PeerConnectionPool
 
 from txdav.common.datastore.sql_tables import schema
 from txdav.common.datastore.upgrade.sql.upgrade import (
@@ -70,49 +71,40 @@
     UpgradeDatabaseCalendarDataStep, UpgradeDatabaseOtherStep,
 )
 from txdav.common.datastore.upgrade.migrate import UpgradeToDatabaseStep
+from txdav.caldav.datastore.scheduling.imip.inbound import MailRetriever
+from txdav.caldav.datastore.scheduling.imip.inbound import scheduleNextMailPoll
 
+from twistedcaldav.config import config, ConfigurationError
+from twistedcaldav.stdconfig import DEFAULT_CONFIG, DEFAULT_CONFIG_FILE
 from twistedcaldav.directory import calendaruserproxy
 from twistedcaldav.directory.directory import GroupMembershipCacheUpdater
 from twistedcaldav.localization import processLocalizationFiles
 from twistedcaldav import memcachepool
 from twistedcaldav.upgrade import UpgradeFileSystemFormatStep, PostDBImportStep
+from twistedcaldav.directory.directory import scheduleNextGroupCachingUpdate
 
-from calendarserver.tap.util import pgServiceFromConfig, getDBPool, MemoryLimitService
-from calendarserver.tap.util import checkDirectories
-from calendarserver.tap.util import Stepper
-
-from twext.enterprise.ienterprise import POSTGRES_DIALECT
-from twext.enterprise.ienterprise import ORACLE_DIALECT
-from twext.enterprise.adbapi2 import ConnectionPool
-
 try:
     from twistedcaldav.authkerb import NegotiateCredentialFactory
     NegotiateCredentialFactory  # pacify pyflakes
 except ImportError:
     NegotiateCredentialFactory = None
 
+from calendarserver.tap.util import pgServiceFromConfig, getDBPool, MemoryLimitService
+from calendarserver.tap.util import checkDirectories
+from calendarserver.tap.util import Stepper
 from calendarserver.tap.util import ConnectionDispenser
-
+from calendarserver.tap.util import getRootResource
+from calendarserver.tap.util import storeFromConfig
+from calendarserver.tap.util import pgConnectorFromConfig
+from calendarserver.tap.util import oracleConnectorFromConfig
 from calendarserver.controlsocket import ControlSocket
-from twisted.internet.endpoints import UNIXClientEndpoint, TCP4ClientEndpoint
-
 from calendarserver.controlsocket import ControlSocketConnectingService
-from twisted.protocols.amp import AMP
-from twext.enterprise.queue import WorkerFactory as QueueWorkerFactory
-from twext.enterprise.queue import PeerConnectionPool
 from calendarserver.accesslog import AMPCommonAccessLoggingObserver
 from calendarserver.accesslog import AMPLoggingFactory
 from calendarserver.accesslog import RotatingFileAccessLoggingObserver
-from calendarserver.tap.util import getRootResource
-from calendarserver.tap.util import storeFromConfig
-from calendarserver.tap.util import pgConnectorFromConfig
-from calendarserver.tap.util import oracleConnectorFromConfig
 from calendarserver.push.notifier import PushDistributor
 from calendarserver.push.amppush import AMPPushMaster, AMPPushForwarder
 from calendarserver.push.applepush import ApplePushNotifierService
-from txdav.caldav.datastore.scheduling.imip.inbound import MailRetriever
-from twistedcaldav.directory.directory import scheduleNextGroupCachingUpdate
-from txdav.caldav.datastore.scheduling.imip.inbound import scheduleNextMailPoll
 
 try:
     from calendarserver.version import version
@@ -131,7 +123,6 @@
 
 log = Logger()
 
-from twisted.python.util import uidFromString, gidFromString
 
 
 # Control socket message-routing constants.
@@ -925,8 +916,8 @@
         # Change default log level to "info" as its useful to have
         # that during startup
         #
-        oldLogLevel = logLevelForNamespace(None)
-        setLogLevelForNamespace(None, LogLevel.info)
+        oldLogLevel = log.publisher.levels.logLevelForNamespace(None)
+        log.publisher.levels.setLogLevelForNamespace(None, LogLevel.info)
 
         # Note: 'additional' was used for IMIP reply resource, and perhaps
         # we can remove this
@@ -1076,7 +1067,7 @@
                     ).setServiceParent(connectionService)
 
         # Change log level back to what it was before
-        setLogLevelForNamespace(None, oldLogLevel)
+        log.publisher.levels.setLogLevelForNamespace(None, oldLogLevel)
         return service
 
 

Modified: CalendarServer/trunk/calendarserver/tools/dkimtool.py
===================================================================
--- CalendarServer/trunk/calendarserver/tools/dkimtool.py	2013-06-17 20:55:09 UTC (rev 11378)
+++ CalendarServer/trunk/calendarserver/tools/dkimtool.py	2013-06-18 00:44:18 UTC (rev 11379)
@@ -15,24 +15,26 @@
 # limitations under the License.
 ##
 
+import sys
 from Crypto.PublicKey import RSA
 from StringIO import StringIO
 
-from twext.python.log import LogLevel, setLogLevelForNamespace, StandardIOObserver
+from twisted.internet import reactor
+from twisted.internet.defer import inlineCallbacks
+from twisted.python.usage import Options
+
+from twext.python.log import Logger, LogLevel, StandardIOObserver
 from twext.web2.client.http import ClientRequest
 from twext.web2.http_headers import Headers
 from twext.web2.stream import MemoryStream
 
-from twisted.internet import reactor
-from twisted.internet.defer import inlineCallbacks
-from twisted.python.usage import Options
-
 from txdav.caldav.datastore.scheduling.ischedule.dkim import RSA256, DKIMRequest, \
     PublicKeyLookup, DKIMVerifier, DKIMVerificationError
 
-import sys
+log = Logger()
 
 
+
 def _doKeyGeneration(options):
 
     key = RSA.generate(options["key-size"])
@@ -66,7 +68,7 @@
 def _doRequest(options):
 
     if options["verbose"]:
-        setLogLevelForNamespace("txdav.caldav.datastore.scheduling.ischedule.dkim", LogLevel.debug)
+        log.publisher.levels.setLogLevelForNamespace("txdav.caldav.datastore.scheduling.ischedule.dkim", LogLevel.debug)
 
     # Parse the HTTP file
     request = open(options["request"]).read()
@@ -299,7 +301,7 @@
     observer.start()
 
     if options["verbose"]:
-        setLogLevelForNamespace("txdav.caldav.datastore.scheduling.ischedule.dkim", LogLevel.debug)
+        log.publisher.levels.setLogLevelForNamespace("txdav.caldav.datastore.scheduling.ischedule.dkim", LogLevel.debug)
 
     if options["key-gen"]:
         _doKeyGeneration(options)

Modified: CalendarServer/trunk/calendarserver/tools/loadaugmentdb.py
===================================================================
--- CalendarServer/trunk/calendarserver/tools/loadaugmentdb.py	2013-06-17 20:55:09 UTC (rev 11378)
+++ CalendarServer/trunk/calendarserver/tools/loadaugmentdb.py	2013-06-18 00:44:18 UTC (rev 11379)
@@ -16,15 +16,13 @@
 ##
 from __future__ import print_function
 
-from calendarserver.tools.managetimezones import StandardIOObserver
-from calendarserver.tools.util import loadConfig, getDirectory, \
-    autoDisableMemcached
-
-from getopt import getopt, GetoptError
+import os
+import sys
 from grp import getgrnam
 from pwd import getpwnam
+from getopt import getopt, GetoptError
 
-from twext.python.log import LogLevel, setLogLevelForNamespace
+from twext.python.log import LogLevel, Logger
 
 from twisted.internet import reactor
 from twisted.internet.defer import inlineCallbacks
@@ -34,9 +32,14 @@
 from twistedcaldav.directory import augment
 from twistedcaldav.directory.augment import AugmentXMLDB
 
-import os
-import sys
+from calendarserver.tools.managetimezones import StandardIOObserver
+from calendarserver.tools.util import loadConfig, getDirectory, \
+    autoDisableMemcached
 
+log = Logger()
+
+
+
 class UsageError (StandardError):
     pass
 
@@ -109,7 +112,7 @@
     #
     try:
         loadConfig(configFileName)
-        setLogLevelForNamespace(None, LogLevel.warn)
+        log.publisher.levels.setLogLevelForNamespace(None, LogLevel.warn)
 
         # Shed privileges
         if config.UserName and config.GroupName and os.getuid() == 0:

Modified: CalendarServer/trunk/calendarserver/tools/resources.py
===================================================================
--- CalendarServer/trunk/calendarserver/tools/resources.py	2013-06-17 20:55:09 UTC (rev 11378)
+++ CalendarServer/trunk/calendarserver/tools/resources.py	2013-06-18 00:44:18 UTC (rev 11379)
@@ -17,26 +17,36 @@
 ##
 from __future__ import print_function
 
-from calendarserver.tools.util import loadConfig, getDirectory, setupMemcached, checkDirectory
-from getopt import getopt, GetoptError
+import os
+import sys
 from grp import getgrnam
 from pwd import getpwnam
-from twext.python.log import StandardIOObserver
-from twext.python.log import clearLogLevels
+from getopt import getopt, GetoptError
+
 from twisted.internet import reactor
 from twisted.internet.defer import inlineCallbacks
 from twisted.python.util import switchUID
+
+from twext.python.log import Logger, StandardIOObserver
+
 from twistedcaldav.config import config, ConfigurationError
 from twistedcaldav.directory.appleopendirectory import OpenDirectoryService
 from twistedcaldav.directory.directory import DirectoryService, DirectoryError
 from twistedcaldav.directory.xmlfile import XMLDirectoryService
-import os
-import sys
 
 from calendarserver.platform.darwin.od import dsattributes
+from calendarserver.tools.util import loadConfig, getDirectory, setupMemcached, checkDirectory
 
-__all__ = [ "migrateResources", ]
+log = Logger()
 
+
+
+__all__ = [
+    "migrateResources",
+]
+
+
+
 def usage():
 
     name = os.path.basename(sys.argv[0])
@@ -99,7 +109,7 @@
 
         # Do this first, because modifying the config object will cause
         # some logging activity at whatever log level the plist says
-        clearLogLevels()
+        log.publisher.levels.clearLogLevels()
 
         config.DefaultLogLevel = "info" if verbose else "error"
 

Modified: CalendarServer/trunk/calendarserver/tools/upgrade.py
===================================================================
--- CalendarServer/trunk/calendarserver/tools/upgrade.py	2013-06-17 20:55:09 UTC (rev 11378)
+++ CalendarServer/trunk/calendarserver/tools/upgrade.py	2013-06-18 00:44:18 UTC (rev 11379)
@@ -26,17 +26,20 @@
 import time
 
 from twisted.python.text import wordWrap
-from twisted.python import log
 from twisted.python.usage import Options, UsageError
 
+from twext.python.log import Logger, LogLevel
+
 from twistedcaldav.stdconfig import DEFAULT_CONFIG_FILE
-from calendarserver.tools.cmdline import utilityMain
 from twisted.application.service import Service
 
-
-from twext.python.log import LogLevel, setLogLevelForNamespace
+from calendarserver.tools.cmdline import utilityMain
 from calendarserver.tap.caldav import CalDAVServiceMaker
 
+log = Logger()
+
+
+
 def usage(e=None):
     if e:
         print(e)
@@ -180,8 +183,7 @@
     try:
         output = options.openOutput()
     except IOError, e:
-        stderr.write("Unable to open output file for writing: %s\n" %
-                     (e))
+        stderr.write("Unable to open output file for writing: %s\n" % (e))
         sys.exit(1)
 
     if options.merge:
@@ -189,30 +191,25 @@
             data.MergeUpgrades = True
         config.addPostUpdateHooks([setMerge])
 
-
     def makeService(store):
         return UpgraderService(store, options, output, reactor, config)
 
-
     def onlyUpgradeEvents(event):
-        output.write(logDateString() + ' ' + log.textFromEventDict(event) + "\n")
+        output.write(logDateString() + " " + log.textFromEventDict(event) + "\n")
         output.flush()
 
     if not options["status"]:
-        setLogLevelForNamespace(None, LogLevel.debug)
+        log.publisher.levels.setLogLevelForNamespace(None, LogLevel.debug)
         log.addObserver(onlyUpgradeEvents)
 
-
     def customServiceMaker():
         customService = CalDAVServiceMaker()
         customService.doPostImport = options["postprocess"]
         return customService
 
-
     def _patchConfig(config):
         config.FailIfUpgradeNeeded = options["status"]
 
-
     def _onShutdown():
         if not UpgraderService.started:
             print("Failed to start service.")

Modified: CalendarServer/trunk/contrib/performance/loadtest/test_sim.py
===================================================================
--- CalendarServer/trunk/contrib/performance/loadtest/test_sim.py	2013-06-17 20:55:09 UTC (rev 11378)
+++ CalendarServer/trunk/contrib/performance/loadtest/test_sim.py	2013-06-18 00:44:18 UTC (rev 11379)
@@ -195,7 +195,7 @@
     def run(self):
         for thunk in self._whenRunning:
             thunk()
-        msg(self.message)
+        msg(thingo=self.message)
         for _ignore_phase, event, thunk in self._triggers:
             if event == 'shutdown':
                 thunk()
@@ -535,4 +535,6 @@
         self.assertEquals(io.getvalue(), "\n*** PASS\n")
         self.assertTrue(observers[0].reported)
         self.assertEquals(
-            observers[0].events[0]['message'], (Reactor.message,))
+            [e for e in observers[0].events if "thingo" in e][0]["thingo"],
+            Reactor.message
+        )

Modified: CalendarServer/trunk/twext/python/log.py
===================================================================
--- CalendarServer/trunk/twext/python/log.py	2013-06-17 20:55:09 UTC (rev 11378)
+++ CalendarServer/trunk/twext/python/log.py	2013-06-18 00:44:18 UTC (rev 11379)
@@ -51,15 +51,11 @@
 # TODO List:
 #
 # * Monkey patch logging in Twisted to use our LegacyLogger to sprinkle betterness everywhere
-# * Move namespace settings to Filter class
 #
 
 __all__ = [
     "InvalidLogLevelError",
     "LogLevel",
-    "logLevelForNamespace",
-    "setLogLevelForNamespace",
-    "clearLogLevels",
     "formatEvent",
     "Logger",
     "LegacyLogger",
@@ -141,65 +137,6 @@
 }
 
 
-#
-# Tools for managing log levels
-#
-
-def logLevelForNamespace(namespace):
-    """
-    @param namespace: a logging namespace, or C{None} for the default
-        namespace.
-
-    @return: the L{LogLevel} for the specified namespace.
-    """
-    if not namespace:
-        return logLevelsByNamespace[None]
-
-    if namespace in logLevelsByNamespace:
-        return logLevelsByNamespace[namespace]
-
-    segments = namespace.split(".")
-    index = len(segments) - 1
-
-    while index > 0:
-        namespace = ".".join(segments[:index])
-        if namespace in logLevelsByNamespace:
-            return logLevelsByNamespace[namespace]
-        index -= 1
-
-    return logLevelsByNamespace[None]
-
-
-def setLogLevelForNamespace(namespace, level):
-    """
-    Sets the global log level for a logging namespace.
-
-    @param namespace: a logging namespace
-
-    @param level: the L{LogLevel} for the given namespace.
-    """
-    if level not in LogLevel.iterconstants():
-        raise InvalidLogLevelError(level)
-
-    if namespace:
-        logLevelsByNamespace[namespace] = level
-    else:
-        logLevelsByNamespace[None] = level
-
-
-def clearLogLevels():
-    """
-    Clears all global log levels to the default.
-    """
-    logLevelsByNamespace.clear()
-    logLevelsByNamespace[None] = LogLevel.warn  # Default log level
-
-
-logLevelsByNamespace = {}
-clearLogLevels()
-
-
-
 ##
 # Loggers
 ##
@@ -296,6 +233,10 @@
     """
     Logging object.
     """
+
+    publisher = lambda e: None
+
+
     def __init__(self, namespace=None, source=None):
         """
         @param namespace: The namespace for this logger.  Uses a dotted
@@ -416,23 +357,7 @@
         self.emit(level, format, log_failure=failure, **kwargs)
 
 
-    def level(self):
-        """
-        @return: the global log level for this logger's namespace.
-        """
-        return logLevelForNamespace(self.namespace)
 
-
-    def setLevel(self, level):
-        """
-        Set the global log level for this logger's namespace.
-
-        @param level: a L{LogLevel}
-        """
-        setLogLevelForNamespace(self.namespace, level)
-
-
-
 class LegacyLogger(Logger):
     """
     A L{Logger} that provides some compatibility with the L{twisted.python.log}
@@ -654,11 +579,70 @@
     lower than the log level for the event's namespace.
     """
 
+    def __init__(self):
+        # FIXME: Make this a class variable. But that raises an
+        # _initializeEnumerants constants error in Twisted 12.2.0.
+        self.defaultLogLevel = LogLevel.info
+
+        self._logLevelsByNamespace = {}
+        self.clearLogLevels()
+
+
+    def logLevelForNamespace(self, namespace):
+        """
+        @param namespace: a logging namespace, or C{None} for the default
+            namespace.
+
+        @return: the L{LogLevel} for the specified namespace.
+        """
+        if not namespace:
+            return self._logLevelsByNamespace[None]
+
+        if namespace in self._logLevelsByNamespace:
+            return self._logLevelsByNamespace[namespace]
+
+        segments = namespace.split(".")
+        index = len(segments) - 1
+
+        while index > 0:
+            namespace = ".".join(segments[:index])
+            if namespace in self._logLevelsByNamespace:
+                return self._logLevelsByNamespace[namespace]
+            index -= 1
+
+        return self._logLevelsByNamespace[None]
+
+
+    def setLogLevelForNamespace(self, namespace, level):
+        """
+        Sets the global log level for a logging namespace.
+
+        @param namespace: a logging namespace
+
+        @param level: the L{LogLevel} for the given namespace.
+        """
+        if level not in LogLevel.iterconstants():
+            raise InvalidLogLevelError(level)
+
+        if namespace:
+            self._logLevelsByNamespace[namespace] = level
+        else:
+            self._logLevelsByNamespace[None] = level
+
+
+    def clearLogLevels(self):
+        """
+        Clears all global log levels to the default.
+        """
+        self._logLevelsByNamespace.clear()
+        self._logLevelsByNamespace[None] = self.defaultLogLevel
+
+
     def __call__(self, event):
         level     = event["log_level"]
         namespace = event["log_namespace"]
 
-        if level < logLevelForNamespace(namespace):
+        if level < self.logLevelForNamespace(namespace):
             return PredicateResult.no
 
         return PredicateResult.maybe
@@ -718,13 +702,12 @@
 # FIXME: This could have a better name.
 class DefaultLogPublisher(object):
     """
-    The default log publisher.  This observer sets up a set of chained observers
-    as follows:
+    This observer sets up a set of chained observers as follows:
 
         1. B{rootPublisher} - a L{LogPublisher}
 
-        2. B{filteringObserver}: a L{FilteringLogObserver} that filters out
-           messages using a L{LogLevelFilterPredicate}
+        2. B{filters}: a L{FilteringLogObserver} that filters out messages
+           using a L{LogLevelFilterPredicate}
 
         3. B{filteredPublisher} - a L{LogPublisher}
 
@@ -764,8 +747,9 @@
     def __init__(self):
         self.legacyLogObserver = LegacyLogObserver(twistedLogMessage)
         self.filteredPublisher = LogPublisher(self.legacyLogObserver)
-        self.filteringObserver = FilteringLogObserver(self.filteredPublisher, (LogLevelFilterPredicate(),))
-        self.rootPublisher     = LogPublisher(self.filteringObserver)
+        self.levels            = LogLevelFilterPredicate()
+        self.filters           = FilteringLogObserver(self.filteredPublisher, (self.levels,))
+        self.rootPublisher     = LogPublisher(self.filters)
 
 
     def __call__(self, event):
@@ -773,6 +757,10 @@
 
 
 
+Logger.publisher = DefaultLogPublisher()
+
+
+
 #
 # Utilities
 #
@@ -817,20 +805,13 @@
     @rtype: L{unicode}
     """
     return unicode(
-        formatter.vformat(formatString, (), CallMapping(mapping))
+        theFormatter.vformat(formatString, (), CallMapping(mapping))
     )
 
-formatter = Formatter()
+theFormatter = Formatter()
 
 
 
-#
-# Wire up default publisher
-#
-Logger.publisher = DefaultLogPublisher()
-
-
-
 ######################################################################
 # FIXME: This may not be needed; look into removing it.
 

Modified: CalendarServer/trunk/twext/python/test/test_log.py
===================================================================
--- CalendarServer/trunk/twext/python/test/test_log.py	2013-06-17 20:55:09 UTC (rev 11378)
+++ CalendarServer/trunk/twext/python/test/test_log.py	2013-06-18 00:44:18 UTC (rev 11379)
@@ -22,18 +22,20 @@
 
 from twext.python.log import (
     LogLevel, InvalidLogLevelError,
-    logLevelsByNamespace,
-    logLevelForNamespace, setLogLevelForNamespace, clearLogLevels,
     pythonLogLevelMapping,
     formatEvent, formatWithCall,
     Logger, LegacyLogger,
     ILogObserver, LogPublisher,
     FilteringLogObserver, PredicateResult,
+    LogLevelFilterPredicate,
 )
 
 
 
-defaultLogLevel = logLevelsByNamespace[None]
+defaultLogLevel         = LogLevelFilterPredicate().defaultLogLevel
+clearLogLevels          = Logger.publisher.levels.clearLogLevels
+logLevelForNamespace    = Logger.publisher.levels.logLevelForNamespace
+setLogLevelForNamespace = Logger.publisher.levels.setLogLevelForNamespace
 
 
 
@@ -343,14 +345,15 @@
         Test that log levels and messages are emitted correctly for
         Logger.
         """
-        # FIXME:Need a basic test like this for logger attached to a class.
+        # FIXME: Need a basic test like this for logger attached to a class.
         # At least: source should not be None in that case.
 
+        log = TestLogger()
+
         for level in LogLevel.iterconstants():
             format = "This is a {level_name} message"
             message = format.format(level_name=level.name)
 
-            log = TestLogger()
             method = getattr(log, level.name)
             method(format, junk=message, level_name=level.name)
 
@@ -359,7 +362,7 @@
             self.assertEquals(log.emitted["format"], format)
             self.assertEquals(log.emitted["kwargs"]["junk"], message)
 
-            if level >= log.level():
+            if level >= logLevelForNamespace(log.namespace):
                 self.assertEquals(log.event["log_format"], format)
                 self.assertEquals(log.event["log_level"], level)
                 self.assertEquals(log.event["log_namespace"], __name__)
@@ -422,18 +425,6 @@
         self.assertEquals(log.event["log_source"], None)
 
 
-    def test_setLevel(self):
-        """
-        Set level on the logger directly.
-        """
-        log = Logger()
-
-        for level in (LogLevel.error, LogLevel.info):
-            log.setLevel(level)
-            self.assertIdentical(level, log.level())
-            self.assertIdentical(level, logLevelForNamespace(log.namespace))
-
-
     def test_logInvalidLogLevel(self):
         """
         Test passing in a bogus log level to C{emit()}.

Modified: CalendarServer/trunk/twistedcaldav/stdconfig.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/stdconfig.py	2013-06-17 20:55:09 UTC (rev 11378)
+++ CalendarServer/trunk/twistedcaldav/stdconfig.py	2013-06-18 00:44:18 UTC (rev 11379)
@@ -15,33 +15,32 @@
 # limitations under the License.
 ##
 
-from socket import getfqdn
-from socket import gethostbyname
+import os
 import copy
-import os
 import re
+from socket import getfqdn, gethostbyname
 
-from txdav.xml import element as davxml
-from twext.web2.dav.resource import TwistedACLInheritable
+from twisted.python.runtime import platform
 
 from twext.python.plistlib import PlistParser #@UnresolvedImport
-from twext.python.log import Logger, InvalidLogLevelError
-from twext.python.log import clearLogLevels, LogLevel, setLogLevelForNamespace
+from twext.python.log import Logger, InvalidLogLevelError, LogLevel
+from twext.web2.dav.resource import TwistedACLInheritable
 
+from txdav.xml import element as davxml
+
 from twistedcaldav import caldavxml, customxml, carddavxml, mkcolxml
 from twistedcaldav.config import ConfigProvider, ConfigurationError, ConfigDict
 from twistedcaldav.config import config, mergeData, fullServerPath
 from twistedcaldav.util import getPasswordFromKeychain
 from twistedcaldav.util import KeychainAccessError, KeychainPasswordNotFound
+from twistedcaldav.util import computeProcessCount
 
-from twisted.python.runtime import platform
-
 from calendarserver.push.util import getAPNTopicFromCertificate
-from twistedcaldav.util import computeProcessCount
 
-
 log = Logger()
 
+
+
 if platform.isMacOSX():
     DEFAULT_CONFIG_FILE = "/Applications/Server.app/Contents/ServerRoot/private/etc/caldavd/caldavd-apple.plist"
 else:
@@ -1377,17 +1376,21 @@
 
 
 def _updateLogLevels(configDict, reloading=False):
-    clearLogLevels()
+    log.publisher.levels.clearLogLevels()
 
     try:
         if "DefaultLogLevel" in configDict:
             levelName = configDict["DefaultLogLevel"]
             if levelName:
-                setLogLevelForNamespace(None, LogLevel.levelWithName(levelName))
+                log.publisher.levels.setLogLevelForNamespace(
+                    None, LogLevel.levelWithName(levelName)
+                )
 
         if "LogLevels" in configDict:
             for namespace, levelName in configDict["LogLevels"].iteritems():
-                setLogLevelForNamespace(namespace, LogLevel.levelWithName(levelName))
+                log.publisher.levels.setLogLevelForNamespace(
+                    namespace, LogLevel.levelWithName(levelName)
+                )
 
     except InvalidLogLevelError, e:
         raise ConfigurationError("Invalid log level: %s" % (e.level))

Modified: CalendarServer/trunk/twistedcaldav/test/test_cache.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/test/test_cache.py	2013-06-17 20:55:09 UTC (rev 11378)
+++ CalendarServer/trunk/twistedcaldav/test/test_cache.py	2013-06-18 00:44:18 UTC (rev 11379)
@@ -388,7 +388,6 @@
 
         memcacheStub = InMemoryMemcacheProtocol()
         self.rc = MemcacheResponseCache(None, cachePool=memcacheStub)
-        self.rc.log.setLevel(LogLevel.debug)
         self.tokens = {}
 
         self.tokens['/calendars/__uids__/cdaboo/'] = 'uriToken0'

Modified: CalendarServer/trunk/twistedcaldav/test/test_config.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/test/test_config.py	2013-06-17 20:55:09 UTC (rev 11378)
+++ CalendarServer/trunk/twistedcaldav/test/test_config.py	2013-06-18 00:44:18 UTC (rev 11379)
@@ -14,16 +14,20 @@
 # limitations under the License.
 ##
 
+import socket
+
 from twext.python.plistlib import writePlist #@UnresolvedImport
-from twext.python.log import LogLevel, logLevelForNamespace
+from twext.python.log import LogLevel
+from twext.python.test.test_log import defaultLogLevel, logLevelForNamespace
 
 from twistedcaldav.config import config, ConfigDict, mergeData
 from twistedcaldav.resource import CalDAVResource
 from twistedcaldav.stdconfig import DEFAULT_CONFIG, PListConfigProvider, \
     RELATIVE_PATHS
 from twistedcaldav.test.util import TestCase
-import socket
 
+
+
 testConfig = """<?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
 <plist version="1.0">
@@ -36,7 +40,7 @@
   <integer>8008</integer>
 
   <key>DefaultLogLevel</key>
-  <string>info</string>
+  <string>error</string>
   <key>LogLevels</key>
   <dict>
     <key>some.namespace</key>
@@ -66,6 +70,8 @@
 </plist>
 """
 
+
+
 def _testResponseCompression(testCase):
     testCase.assertEquals(config.ResponseCompression, False)
 
@@ -328,22 +334,27 @@
         """
         Logging module configures properly.
         """
+        self.assertNotEqual(
+            defaultLogLevel, LogLevel.error,
+            "This test assumes the default log level is not error."
+        )
+
         config.setDefaults(DEFAULT_CONFIG)
         config.reload()
 
-        self.assertEquals(logLevelForNamespace(None), LogLevel.warn)
-        self.assertEquals(logLevelForNamespace("some.namespace"), LogLevel.warn)
+        self.assertEquals(logLevelForNamespace(None), defaultLogLevel)
+        self.assertEquals(logLevelForNamespace("some.namespace"), defaultLogLevel)
 
         config.load(self.testConfig)
 
-        self.assertEquals(logLevelForNamespace(None), LogLevel.info)
+        self.assertEquals(logLevelForNamespace(None), LogLevel.error)
         self.assertEquals(logLevelForNamespace("some.namespace"), LogLevel.debug)
 
         writePlist({}, self.testConfig)
         config.reload()
 
-        self.assertEquals(logLevelForNamespace(None), LogLevel.warn)
-        self.assertEquals(logLevelForNamespace("some.namespace"), LogLevel.warn)
+        self.assertEquals(logLevelForNamespace(None), defaultLogLevel)
+        self.assertEquals(logLevelForNamespace("some.namespace"), defaultLogLevel)
 
 
     def test_ConfigDict(self):
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20130617/28babc10/attachment-0001.html>


More information about the calendarserver-changes mailing list