i'm writing filter log requests , responses
object loggingfilter extends essentialfilter { def apply(next: essentialaction) = new essentialaction { def apply(rh: requestheader) = { val start = system.currenttimemillis def logtime(result: plainresult): result = result match { case simple @ simpleresult(header, content) => val time = system.currenttimemillis - start play.logger.info(s"${rh.method} ${rh.uri} took ${time}ms , returned ${header.status}") result case _ => result } next(rh).map { case plain: plainresult => logtime(plain) case async: asyncresult => async.transform(logtime) } } } } i need log request , response bodies. these buried inside iterators/enumerators, there easier way access bodies without having go details of how iteratees work? otherwise how can convert request , response bodies string?
if want capture simpleresult response body use this:
def logtime(result: plainresult): result = result match { case simple @ simpleresult(header, content) => { val time = system.currenttimemillis - start simpleresult(header, content &> enumeratee.map(a => { play.logger.info(s"${rh.method} ${rh.uri} took ${time}ms , returned ${header.status} body ${a}") simple.writeable.transform(a) })) } case _ => result } check mimetype json:
def logtime(result: plainresult): result = { result.header.headers.get(headernames.content_type) match { case some(ct) if ct.trim.startswith(mimetypes.json) => result match { case simple @ simpleresult(header, content) => val time = system.currenttimemillis - start simpleresult(header, content &> enumeratee.map(a => { play.logger.info(s"${rh.method} ${rh.uri} took ${time}ms , returned ${header.status} body ${a}") simple.writeable.transform(a) })) } case ct => result } }
Comments
Post a Comment