Я использую 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)»
Спасибо заранее.