【问题标题】:How to make akka-http logRequest log to a specific logger log file如何使 akka-http logRequest 记录到特定的记录器日志文件
【发布时间】:2019-02-01 12:56:14
【问题描述】:

我有一个定义路由的 Main 非参与者类。

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

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

【问题讨论】:

    标签: scala akka logback slf4j akka-http


    【解决方案1】:

    如果非要用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 日志记录

    直接使用akka's logging functionality会容易得多。

    这仍然允许您interact with the slf4j api。通过使用 slf4j API,您可以指定要使用的 logback appender,包括在配置设置中指定输出文件的file appenders

    【讨论】:

    • 谢谢。你的建议对我有用。我想知道“不建议混合和匹配日志系统”这一事实。我应该如何使用 Akka 的 LoggingAdapter 将“logRequest”日志记录到我选择的文件(例如“access_log”)中?
    • @user5325596 欢迎您。我已经更新了我的答案以反映如何直接使用 akka 日志记录并指定输出文件。快乐的黑客攻击。
    • 再次感谢。您的更新帮助我找到了“正确”的做法。
    猜你喜欢
    • 2015-05-21
    • 2018-01-17
    • 1970-01-01
    • 2023-03-11
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-13
    相关资源
    最近更新 更多