def start(self, application): """ Initialize the global logging system for the given application. If a custom logger was specified on the command line it will be used. If not, and an L{logger.ILogObserver} or legacy L{log.ILogObserver} component has been set on C{application}, then it will be used as the log observer. Otherwise a log observer will be created based on the command line options for built-in loggers (e.g. C{--logfile}). @param application: The application on which to check for an L{logger.ILogObserver} or legacy L{log.ILogObserver}. @type application: L{twisted.python.components.Componentized} """ if self._observerFactory is not None: observer = self._observerFactory() else: observer = application.getComponent(logger.ILogObserver, None) if observer is None: # If there's no new ILogObserver, try the legacy one observer = application.getComponent(log.ILogObserver, None) if observer is None: observer = self._getLogObserver() self._observer = observer if logger.ILogObserver.providedBy(self._observer): observers = [self._observer] elif log.ILogObserver.providedBy(self._observer): observers = [logger.LegacyLogObserverWrapper(self._observer)] else: warnings.warn( ( "Passing a logger factory which makes log observers which do " "not implement twisted.logger.ILogObserver or " "twisted.python.log.ILogObserver to " "twisted.application.app.AppLogger was deprecated in " "Twisted 16.2. Please use a factory that produces " "twisted.logger.ILogObserver (or the legacy " "twisted.python.log.ILogObserver) implementing objects " "instead." ), DeprecationWarning, stacklevel=2, ) observers = [logger.LegacyLogObserverWrapper(self._observer)] logger.globalLogBeginner.beginLoggingTo(observers) self._initialLog()
def _startLoggingWithObserver(observer, setStdout=1): """Replacement for `t.p.log.startLoggingWithObserver`. When `twistd` starts in 16.0 it initialises the legacy logging system. Intercept this to DTRT with either a modern or legacy observer. In Xenial (with Twisted 16.0) `observer` is probably a legacy observer, like twisted.python.log.FileLogObserver, but we should check if it's modern. In either case we should call through to the `globalLogBeginner` ourselves. In Yakkety (with Twisted 16.4) this function will not be called; `t.application.app.AppLogger` does the right thing already. """ if not twistedModern.ILogObserver.providedBy(observer): observer = twistedModern.LegacyLogObserverWrapper(observer) twistedModern.globalLogBeginner.beginLoggingTo( [observer], discardBuffer=False, redirectStandardIO=bool(setStdout))