用于处理 org.jboss.netty.handler.logging.LoggingHandler 输出的 Logb



我正在使用 Play 2.3 开发应用程序,并在启动 Play 应用程序时使用 -Dhttp.netty.log.wire=true 启用了 netty log wire。我还在自定义logger.xml文件中设置了记录器org.jboss.netty.handler.logging.LoggingHandlerlevel="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>

最新更新