Bug 1050700 - Add support for exc_info to mozlog.structured log actions, r=chmanchester

This commit is contained in:
James Graham 2014-08-13 15:10:46 +01:00
parent 78992ca9fe
commit 85253ec496
4 changed files with 35 additions and 6 deletions

View File

@ -247,9 +247,14 @@ class MachFormatter(base.BaseFormatter):
level = self.terminal.blue(level)
if data.get('component'):
return " ".join([data["component"], level, data["message"]])
rv = " ".join([data["component"], level, data["message"]])
else:
rv = "%s %s" % (level, message)
return "%s %s" % (level, data["message"])
if "stack" in data:
rv += "\n%s" % data["stack"]
return rv
def _get_subtest_data(self, data):
test = self._get_test_id(data)

View File

@ -18,9 +18,14 @@ class TbplFormatter(BaseFormatter):
def log(self, data):
if data.get('component'):
return "%s %s\n" % (data["component"], data["message"])
message = "%s %s" % (data["component"], data["message"])
else:
message = data["message"]
return "%s\n" % (data["message"])
if "stack" in data:
message += "\n%s" % data["stack"]
return "%s\n" % message
def process_output(self, data):
return "PROCESS | %(process)s | %(data)s\n" % data

View File

@ -165,3 +165,7 @@ class List(DataType):
class Int(DataType):
def convert(self, data):
return int(data)
class Any(DataType):
def convert(self, data):
return data

View File

@ -7,9 +7,11 @@ from __future__ import unicode_literals
from multiprocessing import current_process
from threading import current_thread, Lock
import json
import sys
import time
import traceback
from logtypes import Unicode, TestId, Status, SubStatus, Dict, List, log_action, convertor_registry
from logtypes import Unicode, TestId, Status, SubStatus, Dict, List, Any, log_action, convertor_registry
"""Structured Logging for recording test results.
@ -297,14 +299,27 @@ class StructuredLogger(object):
def _log_func(level_name):
@log_action(Unicode("message"))
@log_action(Unicode("message"),
Any("exc_info", default=False))
def log(self, data):
exc_info = data.pop("exc_info", None)
if exc_info:
if not isinstance(exc_info, tuple):
exc_info = sys.exc_info()
if exc_info != (None, None, None):
bt = traceback.format_exception(*exc_info)
data["stack"] = u"\n".join(bt)
data["level"] = level_name
self._log_data("log", data)
log.__doc__ = """Log a message with level %s
:param message: The string message to log
:param exc_info: Either a boolean indicating whether to include a traceback
derived from sys.exc_info() or a three-item tuple in the
same format as sys.exc_info() containing exception information
to log.
""" % level_name
log.__name__ = str(level_name).lower()
return log