我正在使用 Play 2.3 开发应用程序,并在启动 Play 应用程序时使用 -Dhttp.netty.log.wire=true
启用了 netty log wire。我还在自定义logger.xml
文件中设置了记录器org.jboss.netty.handler.logging.LoggingHandler
的level="DEBUG"
,该文件已添加到Play应用程序的conf
目录中。接下来,我想将日志消息从此记录器带到具有滚动策略的文件中。为此,我的logger.xml
文件中有以下配置。
<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
文件中的日志消息过于冗长,与同一请求/响应对应的事件进入多行。我可以理解,发生这种情况是由于我在滚动文件追加器的logger.xml
中指定的encoder
块,如下所示。
<encoder>
<pattern>
%date{yyyy-MM-dd HH:mm:ss ZZZZ} %message%n
</pattern>
...
</encoder>
我在 logback 文档中看到我们可以为encoder
指定一个layout
类,如下所示,
<encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
<layout class="some layout class">
<pattern>
a pattern definition matching the layout class
</pattern>
</layout>
</encoder>
现在我的问题是,对于我正在使用的生成日志消息的记录器,Logback 中是否有任何标准layout
类,即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-rest-web/v1/product/1467866?skuDetail=true
#StatusCode
- 响应状态代码,例如 200
#BytesSent
- 响应的内容长度,例如 3167
#UserAgent
- 远程用户代理,例如"Mozilla/5.0(Linux;U;安卓 4.4.4;Nexus 5 Build/KTU84P)"
提前谢谢。
我们遵循了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;
});
}}
同样在应用程序记录器中.xml将模式更改为仅消息,因为我们也想格式化时间。
<encoder>
<pattern>%message%n</pattern>
<!-- this quadruples logging throughput -->
</encoder>