~marco-giusti/virtualbrick/deb-package

« back to all changes in this revision

Viewing changes to virtualbricks/log.py

MergeĀ fromĀ upstream

Show diffs side-by-side

added added

removed removed

Lines of Context:
38
38
           "replaceTwistedLoggers"]
39
39
 
40
40
 
41
 
def make_id(log_format):
42
 
    module = inspect.currentframe().f_back.f_back.f_globals["__name__"]
 
41
def make_id(log_format, module=None):
 
42
    if module is None:
 
43
        module = inspect.currentframe().f_back.f_back.f_globals["__name__"]
43
44
    params = urllib.urlencode(dict(format=log_format, module=module))
44
45
    uri = "http://virtualbricks.eu/ns/log/?" + params
45
46
    return uuid.uuid5(uuid.NAMESPACE_URL, uri)
47
48
 
48
49
class Event(object):
49
50
 
50
 
    def __init__(self, log_format, log_id=None):
 
51
    def __init__(self, log_format, log_id=None, module=None):
51
52
        self.log_format = log_format
52
53
        if log_id is None:
53
 
            log_id = make_id(log_format)
 
54
            log_id = make_id(log_format, module)
54
55
        self.log_id = log_id
55
56
 
56
57
    def __call__(self, logger, level, **kwds):
204
205
import logging
205
206
 
206
207
 
207
 
class LoggingToNewLogginAdapter(logging.Handler):
 
208
class StdLoggingAdapter(logging.Handler):
208
209
 
209
210
    logger = Logger()
210
211
    levels = {
218
219
    def emit(self, record):
219
220
        kw = dict(("rec_" + k, v) for k, v in record.__dict__.items())
220
221
        kw["log_record"] = True
221
 
        try:
222
 
            msg = self.format(record)
223
 
        except Exception:
224
 
            self.logger.failure("Unformattable event", **record.__dict__)
225
 
        else:
226
 
            if record.exc_info is not None:
227
 
                tpe, value, tb = record.exc_info
228
 
                self.logger.failure(msg, failure.Failure(value, tpe, tb), **kw)
 
222
        event = Event(self.format(record), module="virtualbricks.log.std")
 
223
        if record.exc_info is not None:
 
224
            tpe, value, tb = record.exc_info
 
225
            self.logger.failure(event, failure.Failure(value, tpe, tb), **kw)
 
226
        else:
 
227
            try:
 
228
                level = self.levels[record.levelname]
 
229
            except KeyError:
 
230
                if record.levelno < logging.DEBUG:
 
231
                    level = LogLevel.debug
 
232
                elif record.levelno < logging.INFO:
 
233
                    level = LogLevel.info
 
234
                elif record.levelno < logging.WARNING:
 
235
                    level = LogLevel.warn
 
236
                else:
 
237
                    level = LogLevel.error
 
238
            event(self.logger, level, **kw)
 
239
 
 
240
 
 
241
class LegacyAdapter:
 
242
 
 
243
    logger = Logger()
 
244
    levels = {
 
245
        "DEBUG": LogLevel.debug,
 
246
        "INFO": LogLevel.info,
 
247
        "WARNING": LogLevel.warn,
 
248
        "ERROR": LogLevel.error,
 
249
        "CRITICAL": LogLevel.error
 
250
    }
 
251
 
 
252
    def __call__(self, event):
 
253
        if "log_id" in event:
 
254
            # don't play ping pong with the LegacyLogObserver
 
255
            return
 
256
        if isinstance(event["message"], basestring):
 
257
            msg = event["message"]
 
258
        else:
 
259
            msg = "\n".join(event["message"])
 
260
        ev = Event(msg, module="virtualbricks.log.legacy")
 
261
        if event["isError"]:
 
262
            fail = event.get("failure")
 
263
            if fail:
 
264
                self.logger.failure(ev, log_failure=fail, **event)
229
265
            else:
230
 
                level = self.levels.get(record.levelname, LogLevel.info)
231
 
                self.logger.emit(level, msg, **kw)
 
266
                self.logger.error(ev, **event)
 
267
        else:
 
268
            self.logger.info(ev, **event)