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(a)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