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

Scala 如何将akka http logRequest日志记录到特定的记录器日志文件,scala,akka,logback,slf4j,akka-http,Scala,Akka,Logback,Slf4j,Akka Http,我有一个主要的非参与者类,其中定义了路由 我想将这些路由的传入请求记录到一个特定的日志文件中,但它们正在被记录到“根”日志文件中 val logger = LoggerFactory.getLogger("access_log")l logger.info("log to access log") //<--- is logged in access log file val routes = path("ping" ) { logRequest("log

我有一个主要的非参与者类,其中定义了路由

我想将这些路由的传入请求记录到一个特定的日志文件中,但它们正在被记录到“根”日志文件中

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")
          }
        }
      }
有人能帮忙吗

编辑2:在@Ramon J Romero y Vigil更新了他的答案后,我意识到我可以简单地(给出一个正确配置的logback.xml)做:

编辑:

根据@Ramon J Romero y Vigil的回答,我可以通过以下操作将请求记录到我的访问日志中:

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,并覆盖LoggingAdapter中的所有抽象字段:

val logger = LoggerFactory.getLogger("access_log")

val loggingAdapter : LoggingAdapter = new LoggingAdapter {
  override def isDebugEnabled : Boolean = logger.isDebugEnabled
  override def isErrorEnabled : Boolean = logger.isErrorEnabled
  ...
}
现在可以通过添加指令来使用适配器

直接使用Akka日志记录

它更容易直接利用


这仍然让你可以。通过使用slf4j API,您可以指定要使用的logback appender,包括在配置设置中指定的输出文件。

谢谢。你的建议对我有用。我想知道“不建议混合和匹配日志系统”。我应该如何使用Akka的LoggingAdapter将“logRequest”日志记录到我选择的文件(例如“access_log”)中?@user5325596不客气。我已经更新了我的答案,以反映如何直接使用akka日志并指定输出文件。祝你黑客愉快,再次感谢。你的更新帮助我找到了“正确”的方法。
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")
          }
        }
      } 
val logger = LoggerFactory.getLogger("access_log")

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