Как сделать akka-http logRequest log для конкретного файла журнала logger - PullRequest
0 голосов
/ 01 февраля 2019

У меня есть класс Main-actor, в котором определены маршруты.

Я хотел бы записывать входящие запросы на эти маршруты в определенный файл журнала, но они регистрируются в файле журнала 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")
          }
        }
      }

Документация гласит: «Чтобы изменить регистратор, оберните эту директиву с помощью 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 Iудалось получить запросы, зарегистрированные в моем 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")
          }
        }
      } 

1 Ответ

0 голосов
/ 02 февраля 2019

Если вам нужно использовать LoggerFactory

Выглядит так, как будто вы используете slf4j напрямую, вместо использования механизмов регистрации akka, но вы хотите, чтобы akka использовала 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 Logging

Гораздо проще использовать функции ведения журнала akka напрямую.

Это по-прежнему позволяет взаимодействовать сAPI SLF4J .Используя API-интерфейс slf4j, вы можете указать, какое приложение для входа в систему вы хотите использовать, включая файловые приложения , в которых выходной файл указан в настройках конфигурации.

...