如何让akka-http logRequest记录到特定的logger日志文件
How to make akka-http logRequest log to a specific logger log file
我有一个 Main 非参与者 class,其中定义了路由。
我想将对这些路由的传入请求记录到特定的日志文件中,但它们正在记录到 "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")
}
}
}
documentation 声明 "To change the logger, wrap this directive by withLog.",但我不知道如何将我的 logger
更改为 withLog
调用的 LoggingAdapter
.
我的 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")
}
}
}
如果非要用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. By using the slf4j API you can specify which logback appender you want to use, including file appenders在配置设置中指定输出文件。
我有一个 Main 非参与者 class,其中定义了路由。
我想将对这些路由的传入请求记录到特定的日志文件中,但它们正在记录到 "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")
}
}
}
documentation 声明 "To change the logger, wrap this directive by withLog.",但我不知道如何将我的 logger
更改为 withLog
调用的 LoggingAdapter
.
我的 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")
}
}
}
如果非要用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. By using the slf4j API you can specify which logback appender you want to use, including file appenders在配置设置中指定输出文件。