[Kimchi-devel] [PATCH] [Wok 2/3] Fix issue #140 - Add original exception to user request log message
Lucio Correia
luciojhc at linux.vnet.ibm.com
Mon Aug 22 14:58:47 UTC 2016
On 22-08-2016 11:13, Aline Manera wrote:
>
>
> On 08/09/2016 04:15 PM, Lucio Correia wrote:
>> Signed-off-by: Lucio Correia <luciojhc at linux.vnet.ibm.com>
>> ---
>> src/wok/control/base.py | 9 +++++++++
>> src/wok/reqlogger.py | 34 +++++++++++++++++++++++++++++-----
>> src/wok/root.py | 7 ++++++-
>> 3 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()
>
> 'details' and 'status' depends on which exception was raised.
> I'd suggest to pass only the exception (which represents the 'details'
> in this patch) to the RequestRecord() and let it work with the exception.
> That way we simplify the amount of parameters and IMO make it easier to
> work with.
>
Hi Aline, we also log successful requests (no exception).
That's why status is informed separately.
>> 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/reqlogger.py b/src/wok/reqlogger.py
>> index f82ae6b..212a09f 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,20 @@ class RequestRecord(object):
>> return result
>>
>> def __str__(self):
>> + # original exception details
>> + details = ''
>> + if self.details:
>> + self.logData['detCode'] = self.details.getCode()
>> + detParams = self.details.getParams()
>> + details = ">>> %s" % json.JSONEncoder().encode(detParams)
>> +
>> + # 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)
>>
>> 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,
>
--
Lucio Correia
Software Engineer
IBM LTC Brazil
More information about the Kimchi-devel
mailing list