如何让阿卡-HTTP logRequest登录到特定的记录器的日志文件

问题描述 投票:1回答:1

我在那里的路线,定义了主要的非演员类。

我想进入的请求到那些路由登录到特定的日志文件,但它们被记录到“根”的日志文件。

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")
          }
        }
      }

documentation指出:“要改变记录仪,通过withLog包装这个指令。”,但我不知道如何改变我的logger成是LoggingAdapter被称为与withLog

我logback.xml有一个记录条目

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

任何人都可以帮忙吗?

编辑2:以下@RamonĴ罗梅罗Ÿ守夜的更新他的回答我知道我可以简单地(给出一个正确配置的logback.xml)做:

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

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

编辑:

基于@RamonĴ罗梅罗Ÿ守夜的答案,我能得到执行以下操作记录到我的访问日志的要求:

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")
          }
        }
      } 
scala akka logback slf4j akka-http
1个回答
3
投票

如果你必须使用LoggerFactory

它看起来好像你正在使用slf4j,而不是直接使用阿卡的记录机制,但你想阿卡使用SLF4J Logger,而不是自己的LoggingAdapter。这种类型的混合和日志系统的匹配是不建议,更容易坚持一方或另一方。

如果这种混合是必要的,那么你可以只手动创建LoggingAdapter通过使用您已经创建的Logger并覆盖所有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's logging functionality

这仍然可以让你interact with the slf4j api。通过使用SLF4J API,您可以指定哪些附加目的地的logback要使用,包括在输出文件中的配置设置中指定file appenders

© www.soinside.com 2019 - 2024. All rights reserved.