代码之家  ›  专栏  ›  技术社区  ›  user5325596

如何配置logback以获取AKKA HTTP logRequest事件的良好日志

  •  0
  • user5325596  · 技术社区  · 6 年前

    由于对 this question 我可以得到logrequest来记录一个名为access.log的文件。

    我有

    val routes =
          path("ping" ) {
            withLog(accessLog) {
              logRequest("ping", Logging.InfoLevel) {
                complete("pong")
              }
            }
          }
    

    logback.xml配置的一部分看起来像

     <appender name="ACCESSLOG" class="ch.qos.logback.core.rolling.RollingFileAppender">
            <file>log/access.log</file>
            <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
                <pattern>
                    %d{yyyy-MM-dd HH:mm:ss} %msg%n
                </pattern>
            </encoder>
            <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
                <fileNamePattern>log/access-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
                <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                    <maxFileSize>64 MB</maxFileSize>
                </timeBasedFileNamingAndTriggeringPolicy>
            </rollingPolicy>
        </appender>
    

    日志文件中的结果条目看起来像

    2019-02-06 16:51:04 ping: HttpRequest(HttpMethod(GET),http://localhost:8080/ping,List(Host: localhost:8080, Connection: keep-alive, Cache-Control: max-age=0, Upgrade-Insecure-Requests: 1, User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36, Accept: text/html, application/xhtml+xml, application/xml;q=0.9, image/webp, image/apng, */*;q=0.8, Accept-Encoding: gzip, deflate, br, Accept-Language: en-GB, en-US;q=0.9, en;q=0.8, Cookie: xxx, Timeout-Access: <function1>),HttpEntity.Strict(none/none,ByteString()),HttpProtocol(HTTP/1.1))
    

    我该怎么做才能让我的日志看起来像

    2019-02-06 16:51:04 GET /ping <time_taken> 
    
    2 回复  |  直到 6 年前
        1
  •  1
  •   Ivan Stanislavciuc    6 年前

    您可以定义一个方法,该方法将生成 LogEntry 您可以按照自己的方式设置日志消息。

      def myLogEntry(req: HttpRequest): LogEntry = {
        LogEntry(s"${req.method} /${req.uri.path}", Logging.InfoLevel)
      }
    
      logRequest(myLogEntry _) {
        complete("pong")
      }
    

    问题在于 <time_taken> 因为它在指令时不可用 logRequest 执行。此指令在触发指令时打印传入HTTP请求的日志消息。还没有关于内部路由结果的信息,已完成或已拒绝。

    看看这个 blog post 看看如何计算时间。

        2
  •  0
  •   pme    6 年前

    检查 Documentation 对于 pattern .

    我们对这个很满意:

      <conversionRule conversionWord="coloredLevel" converterClass="play.api.libs.logback.ColoredLevel" />
        ...
      <appender ...>
        <encoder>
            <pattern>%date %coloredLevel %logger{15} - %message%n%xException{10}</pattern>
        </encoder>
     </appender>
    

    下面是另一个示例(我在其中找到了结果):

    <appender name="ACCESS_FILE" ...>
      ....     
        <encoder>
                <pattern>%date [%level] from %logger - %message%n%xException</pattern>
            </encoder>
        </appender>
    

    这给了你:

    2018-06-26 12:13:50,377 [INFO] from access-filter - 6. GET /assets/javascripts/versioned.js took 113ms and returned 200
    2018-06-26 12:13:50,377 [INFO] from access-filter - 6. GET /assets/scala-adapters-client-jsdeps.js took 113ms and returned 200