~launchpad-pqm/launchpad/devel

« back to all changes in this revision

Viewing changes to lib/lp/services/twistedsupport/loggingsupport.py

Merged db-devel into replication.

Show diffs side-by-side

added added

removed removed

Lines of Context:
8
8
__metaclass__ = type
9
9
__all__ = [
10
10
    'LaunchpadLogFile',
11
 
    'OOPSLoggingObserver',
12
 
    'log_oops_from_failure',
13
11
    'set_up_logging_for_script',
14
12
    'set_up_oops_reporting',
15
13
    'set_up_tacfile_logging',
23
21
import signal
24
22
import sys
25
23
 
 
24
import oops_twisted
 
25
from oops_twisted import OOPSObserver
26
26
from twisted.python import (
27
27
    log,
28
28
    logfile,
36
36
from canonical.librarian.utils import copy_and_close
37
37
 
38
38
 
39
 
class OOPSLoggingObserver(log.PythonLoggingObserver):
40
 
    """A version of `PythonLoggingObserver` that logs OOPSes for errors."""
41
 
    # XXX: JonathanLange 2008-12-23 bug=314959: As best as I can tell, this
42
 
    # ought to be a log *handler*, not a feature of the bridge from
43
 
    # Twisted->Python logging. Ask Michael about this.
44
 
 
45
 
    def emit(self, eventDict):
46
 
        """See `PythonLoggingObserver.emit`."""
47
 
        if eventDict.get('isError', False) and 'failure' in eventDict:
48
 
            try:
49
 
                failure = eventDict['failure']
50
 
                request = log_oops_from_failure(failure)
51
 
                self.logger.info(
52
 
                    "Logged OOPS id %s: %s: %s",
53
 
                    request.oopsid, failure.type.__name__, failure.value)
54
 
            except:
55
 
                self.logger.exception("Error reporting OOPS:")
56
 
        else:
57
 
            log.PythonLoggingObserver.emit(self, eventDict)
58
 
 
59
 
 
60
 
def log_oops_from_failure(failure, URL=None, **args):
61
 
    request = errorlog.ScriptRequest(args.items(), URL=URL)
62
 
    errorlog.globalErrorUtility.raising(
63
 
        (failure.type, failure.value, failure.getTraceback()),
64
 
        request)
65
 
    return request
66
 
 
67
 
 
68
39
def set_up_logging_for_script(options, name):
69
40
    """Create a `Logger` object and configure twisted to use it.
70
41
 
94
65
    return logger
95
66
 
96
67
 
97
 
def set_up_oops_reporting(configuration, name, mangle_stdout=True):
 
68
def set_up_oops_reporting(name, configuration, mangle_stdout=True):
98
69
    """Set up OOPS reporting by starting the Twisted logger with an observer.
99
70
 
 
71
    :param name: The name of the logger to use for oops reporting.
100
72
    :param configuration: The name of the config section to use for oops
101
73
        reporting.
102
 
    :param name: The name of the logger to use for oops reporting.
103
74
    :param mangle_stdout: If True, send stdout and stderr to the logger.
104
75
        Defaults to False.
105
76
    """
106
 
    errorlog.globalErrorUtility.configure(configuration)
107
 
    log.startLoggingWithObserver(
108
 
        OOPSLoggingObserver(loggerName=name).emit, mangle_stdout)
 
77
    errorlog.globalErrorUtility.configure(
 
78
        configuration,
 
79
        config_factory=oops_twisted.Config,
 
80
        publisher_adapter=oops_twisted.defer_publisher)
 
81
    oops_observer = OOPSObserver(errorlog.globalErrorUtility._oops_config,
 
82
        log.PythonLoggingObserver(loggerName=name).emit)
 
83
    log.startLoggingWithObserver(oops_observer.emit, mangle_stdout)
109
84
 
110
85
 
111
86
class LaunchpadLogFile(DailyLogFile):