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
...
}