繁体   English   中英

如何将akka-http logRequest日志记录到特定的记录器日志文件中

[英]How to make akka-http logRequest log to a specific logger log file

我有一个Main非actor类,其中定义了路由。

我想将传入的请求记录到这些路由到特定的日志文件,但是他们正在登录到“root”日志文件。

val logger = LoggerFactory.getLogger("access_log")l
logger.info("log to access log") //<--- is logged in access log file

val routes =
      path("ping" ) {
          logRequest("logging ping", Logging.InfoLevel) { <-- logged to root log
            complete("pong")
          }
        }
      }

文档说明“要更改记录器,请用withLog包装此指令。”但我不知道如何将我的logger更改为调用LoggingAdapter withLog

我的logback.xml有一个记录器条目

 <logger name="access_log" level="INFO">
        <appender-ref ref="ACCESSLOG" />
    </logger>

有人可以帮忙吗?

编辑2:关注@Ramon J Romero y Vigil对他的回答的更新我意识到我可以简单地(给定一个正确配置的logback.xml)做:

val accessLog = Logging(system.eventStream, "access_log")

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

编辑:

基于@Ramon J Romero和Vigil的回答,我能够通过执行以下操作将请求记录到我的access_log:

val loggingAdapter : LoggingAdapter = new LoggingAdapter {
      override def isDebugEnabled : Boolean = logger.isDebugEnabled
      override def isErrorEnabled : Boolean = logger.isErrorEnabled
      override def isInfoEnabled : Boolean = logger.isInfoEnabled
      override def isWarningEnabled : Boolean = logger.isWarnEnabled

      override def notifyDebug(message: String): Unit = logger.debug(message)

      override protected def notifyError(message: String): Unit =  logger.error(message)

      override protected def notifyError(cause: Throwable, message: String): Unit = logger.error(message, cause)

      override protected def notifyWarning(message: String): Unit = logger.warn(message)

      override protected def notifyInfo(message: String): Unit = logger.info(message)
    }

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

如果必须使用LoggerFactory

看起来好像是直接使用slf4j而不是使用akka的日志记录机制,但是你希望akka使用slf4j Logger而不是自己的LoggingAdapter 不建议采用这种类型的原木系统混合和匹配,更容易坚持使用其中一种。

如果需要这种混合,那么您可以使用您已经创建的Logger手动创建LoggingAdapter并覆盖LoggingAdapter中的所有抽象字段:

val logger = LoggerFactory.getLogger("access_log")

val loggingAdapter : LoggingAdapter = new LoggingAdapter {
  override def isDebugEnabled : Boolean = logger.isDebugEnabled
  override def isErrorEnabled : Boolean = logger.isErrorEnabled
  ...
}

现在可以通过添加withLog指令来使用适配器。

直接使用Akka Logging

直接利用akka的日志记录功能要容易得多。

这仍然允许您与slf4j api进行交互 通过使用slf4j API,您可以指定要使用的logback appender,包括在配置设置中指定输出文件的文件追加器

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM