0

Я использую Play 2.3 для разработки приложения и включил провод проводки netty с помощью -Dhttp.netty.log.wire=true при запуске приложения для воспроизведения. Я также установил level="DEBUG" регистратора org.jboss.netty.handler.logging.LoggingHandler в файле logger.xml, который я добавил в каталог conf приложения Play. Затем я хотел взять сообщения журнала из этого регистратора в файл со скользящей политикой. Для этого у меня есть следующая конфигурация в моем logger.xml файле.Локальный кодер для обработки вывода org.jboss.netty.handler.logging.LoggingHandler

<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 with 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 only goes to the 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> 

Как видно из приведенных выше конфигураций всех сообщений журнала от org.jboss.netty.handler.logging.LoggingHandler отправляемых access.log файла, а все остальные сообщения журнала просто записываются в STDOUT. В этой конфигурации все работает так, как ожидалось, и все сообщения журнала сообщений, связанных с запросом/ответом HTTP, регистрируются в файле access.log.

Но теперь моя проблема в том, что сообщения журнала в файле access.log слишком много подробных, и события, соответствующие одному и тому же запросу/ответу, переходят в многострочные. Я могу понять, что это происходит из-за блока encoder, который я указал в logger.xml для скопированного файла, как показано ниже.

<encoder> 
    <pattern> 
     %date{yyyy-MM-dd HH:mm:ss ZZZZ} %message%n 
    </pattern> 
    ... 
</encoder> 

я видел в документации Logback, что мы можем указать layout класс для encoder, как показано ниже,

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

Теперь вопрос у меня есть, есть ли стандартные layout классы в Logback для регистратор, который я использую, который генерирует сообщения журнала, а именно org.jboss.netty.handler.logging.LoggingHandler?

Я хочу, чтобы каждый журнал событий (то есть HTTP запрос/ответ), чтобы хорошо компактна в одну строку в файле журнала в таком формате, как дать ниже,

#RemoteIP:Port #LocalIP:Port #DateTimeStamp #ElapsedTime #RequestMethod #RequestURI #StatusCode #BytesSent #UserAgent 

Где

#RemoteIP:Port - Удаленный IP-адрес и порт

#LocalIP:Port - Локальный IP-адрес и порт

#DateTimeStamp - Дата и Отметка, такие как 2015-06-12 00:06:44

#ElapsedTime - Время, необходимое для обслуживания запроса, такие как 0,231

#RequestMethod - метод запроса, такие как GET, POST

#RequestURI - запрашиваемого URI такие как/OpenAPI-остальное-Web/v1/продукт/1467866 skuDetail = истинный

#StatusCode - Ответ код состояния, такие как 200

#BytesSent - ответ сервлета длина контента, такая как 3167

#UserAgent - Удаленный пользовательский агент, такой как «" Mozilla/5.0 (Linux; U; Android 4.4.4; Nexus 5 Сложение/KTU84P)»

Спасибо заранее.

ответ

0

Мы проследили, что Action.Simple подход к решению этой проблемы. Вы должны вызвать действие в контроллере со следующими аннотаций @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; 
    }); 
}} 

Кроме того, в приложении-logger.xml изменить шаблон для всего сообщения, так как мы хотели, чтобы отформатировать время.

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