[Kimchi-devel] [PATCH] [Wok 1/2] Fix issue #140 - Add original exception to user request log message
Aline Manera
alinefm at linux.vnet.ibm.com
Mon Aug 22 16:19:45 UTC 2016
On 08/10/2016 03:08 PM, Lucio Correia wrote:
> Now the user request log entries for failed requests will contain
> the original exception causing the request failure.
>
> Signed-off-by: Lucio Correia <luciojhc at linux.vnet.ibm.com>
> ---
> src/wok/control/base.py | 9 +++++++++
> src/wok/exception.py | 1 +
> src/wok/reqlogger.py | 33 ++++++++++++++++++++++++++++-----
> src/wok/root.py | 7 ++++++-
> 4 files changed, 44 insertions(+), 6 deletions(-)
>
> diff --git a/src/wok/control/base.py b/src/wok/control/base.py
> index f563aed..04cf2cb 100644
> --- a/src/wok/control/base.py
> +++ b/src/wok/control/base.py
> @@ -119,6 +119,7 @@ class Resource(object):
> def wrapper(*args, **kwargs):
> # status must be always set in order to request be logged.
> # use 500 as fallback for "exception not handled" cases.
> + details = None
> status = 500
>
> method = 'POST'
> @@ -149,6 +150,7 @@ class Resource(object):
> status = cherrypy.response.status
> return result
> except WokException, e:
> + details = e
> status = e.getHttpStatusCode()
> raise cherrypy.HTTPError(status, e.message)
> finally:
> @@ -157,6 +159,7 @@ class Resource(object):
> reqParams = utf8_dict(self.log_args, request)
> RequestRecord(
> reqParams,
> + details,
> app=get_plugin_from_request(),
> msgCode=code,
> req=method,
> @@ -190,6 +193,7 @@ class Resource(object):
> def index(self, *args, **kargs):
> # status must be always set in order to request be logged.
> # use 500 as fallback for "exception not handled" cases.
> + details = None
> status = 500
>
> method = validate_method(('GET', 'DELETE', 'PUT'),
> @@ -206,6 +210,7 @@ class Resource(object):
>
> status = cherrypy.response.status
> except WokException, e:
> + details = e
> status = e.getHttpStatusCode()
> raise cherrypy.HTTPError(status, e.message)
> except cherrypy.HTTPError, e:
> @@ -217,6 +222,7 @@ class Resource(object):
> code = self.getRequestMessage(method)
> RequestRecord(
> self.log_args,
> + details,
> app=get_plugin_from_request(),
> msgCode=code,
> req=method,
> @@ -427,6 +433,7 @@ class Collection(object):
> def index(self, *args, **kwargs):
> # status must be always set in order to request be logged.
> # use 500 as fallback for "exception not handled" cases.
> + details = None
> status = 500
>
> params = {}
> @@ -444,6 +451,7 @@ class Collection(object):
> status = cherrypy.response.status
> return result
> except WokException, e:
> + details = e
> status = e.getHttpStatusCode()
> raise cherrypy.HTTPError(status, e.message)
> except cherrypy.HTTPError, e:
> @@ -456,6 +464,7 @@ class Collection(object):
> reqParams = utf8_dict(self.log_args, params)
> RequestRecord(
> reqParams,
> + details,
> app=get_plugin_from_request(),
> msgCode=code,
> req=method,
> diff --git a/src/wok/exception.py b/src/wok/exception.py
> index f8f4bd4..09ab998 100644
> --- a/src/wok/exception.py
> +++ b/src/wok/exception.py
> @@ -30,6 +30,7 @@ class WokException(Exception):
> args = {}
> self.httpStatusCode = 500
> self.code = code
> + self.params = args
> msg = WokMessage(code, args).get_text()
> cherrypy.log.error_log.error(msg)
> Exception.__init__(self, msg)
> diff --git a/src/wok/reqlogger.py b/src/wok/reqlogger.py
> index f82ae6b..9f1d2c8 100644
> --- a/src/wok/reqlogger.py
> +++ b/src/wok/reqlogger.py
> @@ -114,7 +114,7 @@ class RequestParser(object):
>
> return LOG_DOWNLOAD_URI % os.path.basename(fd.name)
>
> - def getTranslatedMessage(self, record, params):
> + def getTranslatedMessage(self, record, params, detParams):
> code = record.get('msgCode', '')
> app = record.get('app', 'wok')
> plugin = None
> @@ -122,7 +122,14 @@ class RequestParser(object):
> plugin = "/plugins/%s" % app
>
> msg = WokMessage(code, params, plugin)
> - return msg.get_text(prepend_code=False, translate=True)
> + text = msg.get_text(prepend_code=False, translate=True)
> +
> + detCode = record.get('detCode', '')
> + if detCode:
> + msg = WokMessage(detCode, detParams, plugin)
> + text += ' ' + msg.get_text(prepend_code=True, translate=True)
> +
> + return text
>
> def getRecords(self):
> records = self.getRecordsFromFile(self.baseFile)
> @@ -156,7 +163,14 @@ class RequestParser(object):
> if len(data) > 2:
> # new log format: translate message on the fly
> params = json.JSONDecoder().decode(data[1])
> - msg = self.getTranslatedMessage(record, params)
> + detParams = None
> +
> + # has original exception details
> + if len(data) > 3:
> + detParams = json.JSONDecoder().decode(data[2])
> +
> + msg = self.getTranslatedMessage(record, params,
> + detParams)
> else:
> # make it compatible with v2.2 log files, which
> # messages are already translated
> @@ -203,9 +217,10 @@ class RequestParser(object):
>
>
> class RequestRecord(object):
> - def __init__(self, msgParams, **kwargs):
> + def __init__(self, msgParams, details, **kwargs):
> # log record data
> self.logData = kwargs
> + self.details = details
>
> # data for message translation
> self.code = self.logData['msgCode']
> @@ -224,11 +239,19 @@ class RequestRecord(object):
> return result
>
> def __str__(self):
> + # original exception details
> + details = ''
> + if self.details:
> + self.logData['detCode'] = self.details.code
> + details = ">>> %s" % json.JSONEncoder().encode(self.details.params)
> +
> + # request log message
> msg = WokMessage(self.code, self.params)
> msgText = msg.get_text(prepend_code=False, translate=False)
> logData = json.JSONEncoder().encode(self.logData)
> msgParams = json.JSONEncoder().encode(self.params)
> - return '%s >>> %s >>> %s' % (logData, msgParams, msgText)
> +
> + return '%s >>> %s %s >>> %s' % (logData, msgParams, details, msgText)
The entire log entry should be contained in the JSON object. The same I
commented before.
>
> def log(self):
> reqLogger = logging.getLogger(WOK_REQUEST_LOGGER)
> diff --git a/src/wok/root.py b/src/wok/root.py
> index 08f4981..e54bf38 100644
> --- a/src/wok/root.py
> +++ b/src/wok/root.py
> @@ -153,6 +153,7 @@ class WokRoot(Root):
>
> @cherrypy.expose
> def login(self, *args):
> + details = None
> method = 'POST'
> code = self.getRequestMessage(method, 'login')
> app = 'wok'
> @@ -163,8 +164,11 @@ class WokRoot(Root):
> username = params['username']
> password = params['password']
> except KeyError, item:
> + details = e = MissingParameter('WOKAUTH0003E', {'item': str(item)})
> +
> RequestRecord(
> params,
> + details,
> app=app,
> msgCode=code,
> req=method,
> @@ -173,7 +177,6 @@ class WokRoot(Root):
> ip=ip
> ).log()
>
> - e = MissingParameter('WOKAUTH0003E', {'item': str(item)})
> raise cherrypy.HTTPError(400, e.message)
>
> try:
> @@ -185,6 +188,7 @@ class WokRoot(Root):
> finally:
> RequestRecord(
> params,
> + details,
> app=app,
> msgCode=code,
> req=method,
> @@ -206,6 +210,7 @@ class WokRoot(Root):
>
> RequestRecord(
> params,
> + None,
> app='wok',
> msgCode=code,
> req=method,
More information about the Kimchi-devel
mailing list