playframework - Logback encoder layout for processing output of org.jboss.netty.handler.logging.LoggingHandler -


i using play 2.3 develop application , has enabled netty log wire using -dhttp.netty.log.wire=true when starting play application. have set level="debug" of logger org.jboss.netty.handler.logging.logginghandler in custom logger.xml file have added conf directory of play application. next wanted take log messages logger file rolling policy. this, have following configuration in logger.xml file.

<configuration>      <conversionrule conversionword="coloredlevel" converterclass="play.api.logger$coloredlevel" />      <appender name="stdout" class="ch.qos.logback.core.consoleappender">          <encoder>              <pattern>                 %coloredlevel %logger{15} - %message%n%xexception{5}             </pattern>          </encoder>      </appender>      <appender name="access_file" class="ch.qos.logback.core.rolling.rollingfileappender">         <file>/users/bathiyap/drive/logs/access.log</file>         <!-- daily rollover compression -->         <rollingpolicy class="ch.qos.logback.core.rolling.timebasedrollingpolicy">             <filenamepattern>access-log-%d{yyyy-mm-dd}.gz</filenamepattern>             <!-- keep 1 week worth of history -->             <maxhistory>7</maxhistory>         </rollingpolicy>         <encoder>             <pattern>                 %date{yyyy-mm-dd hh:mm:ss zzzz} %message%n             </pattern>             <immediateflush>false</immediateflush>         </encoder>     </appender>      <!-- additivity=false ensures access log data goes access log -->     <logger name="org.jboss.netty.handler.logging.logginghandler" level="debug" additivity="false">         <appender-ref ref="access_file"/>     </logger>      <logger name="play" level="info" />      <logger name="application" level="debug" />      <root level="error">         <appender-ref ref="stdout"/>     </root>  </configuration> 

as seen above configurations log messages org.jboss.netty.handler.logging.logginghandler sent access.log file while other log messages written stdout. working expected configuration , http request/response related log messages getting logged in access.log file.

but problem is, log messages in access.log file verbose , events corresponding same request/response goes multilines. can understand happening due encoder block have specified in logger.xml rolling file appender below.

<encoder>     <pattern>         %date{yyyy-mm-dd hh:mm:ss zzzz} %message%n     </pattern>     ... </encoder> 

i have seen in logback documentation can specify layout class encoder below,

<encoder class="ch.qos.logback.core.encoder.layoutwrappingencoder">     <layout class="some layout class">         <pattern>             pattern definition matching layout class         </pattern>     </layout> </encoder> 

now question have is, there standard layout classes in logback logger using generates log messages, namely, org.jboss.netty.handler.logging.logginghandler?

i want each log event (i.e. http request/response) nicely compact single line in log file in format such give below,

#remoteip:port #localip:port #datetimestamp #elapsedtime #requestmethod #requesturi #statuscode #bytessent #useragent 

where,

#remoteip:port - remote ip address , port

#localip:port - local ip address , port

#datetimestamp - date , timestamp such 2015-06-12 00:06:44

#elapsedtime - time taken serve request such 0.231

#requestmethod - request method such get, post

#requesturi - requested uri such /openapi-rest-web/v1/product/1467866?skudetail=true

#statuscode - response status code such 200

#bytessent - response's content length such 3167

#useragent - remote user agent such ""mozilla/5.0 (linux; u; android 4.4.4; nexus 5 build/ktu84p)"

thanks in advance.

we followed action.simple approach solve problem. have call action in controller following annotation @with(logaction.class)

@override   public f.promise<result> call(http.context ctx) throws throwable {   http.request request = ctx.request();   date curdate = new date();   simpledateformat format = new simpledateformat("d/eee/yyyy hh:mm:ss z");   f.promise<result> call = delegate.call(ctx);   return call.map(r -> {        accesslogger.info(request.remoteaddress() +               "- ["+format.format(curdate)+"] "+ request.method() +               " "+ request.uri() + " " + r.status());              return r;   }); }} 

also in application-logger.xml change pattern message since wanted format time.

    <encoder>         <pattern>%message%n</pattern>         <!-- quadruples logging throughput -->     </encoder> 

Comments

Popular posts from this blog

c# - Validate object ID from GET to POST -

node.js - Custom Model Validator SailsJS -

php - Find a regex to take part of Email -