имена регистраторов для настройки регистратора akka с помощью обработчика событий - PullRequest
6 голосов
/ 24 января 2012

Итак, я использую Slf4jEventHandler и logback-classic. Как настроить уровни журналов для разных участников отдельно? [Я использую Akka 2.0_M2]

Я пытался сделать что-то вроде

<configuration debug="true" scan="true">
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>%-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>
    <logger name="akka://TradeService" level="DEBUG" />
    <root level="INFO">
        <appender-ref ref="STDOUT" />
    </root>
</configuration>

но это совсем не помогло:

INFO  akka://TradeService/user/realTimeReqListener - Declaring queue
INFO  akka://TradeService/user/restReqListener - Declaring queue
INFO  akka://TradeService/user/restReqListener - Starting listening to queue

Как вы можете видеть, я получаю логирование уровня INFO только для актеров. Какова иерархия имен для регистраторов актеров?

Ответы [ 2 ]

6 голосов
/ 24 января 2012

Я предполагаю, что вы используете веху Akka 2.0, и я также предполагаю, что вы получите свой регистратор следующим образом:

val log = Logging(context.system, this)

Как задокументировано, представление актера по умолчанию в терминах категории журнала - это его путь. К сожалению, logback не подготовлен для работы с иерархиями акторов, он настроен для работы с именами пакетов (то есть иерархией, разделенной точками), поэтому ваши настройки влияют на неправильный регистратор. Недавно произошли некоторые изменения в этой области в мастере Akka, который станет частью этапа 3 (который скоро будет выпущен очень скоро), где категория журнала по умолчанию будет получена из фактического класса реализации (согласно LoggerFactory.getLogger(someClass)). Если вы хотите добиться того же в своей старой версии Akka, используйте

val log = Logging(context.system, getClass.getName)

Обратите внимание, что это, конечно, НЕ объединяет волшебную иерархию имен актеров с именами ваших пакетов, т. Е. Вам придется настраивать для каждого класса акторов, как это принято для традиционных сред ведения журналов Java. Если вы хотите, напишите свое собственное преобразование из пути актера в иерархическое имя, разделенное точками, и передайте полученную строку фабрике:

val log = Logging(context.system.eventStream, mangleMyName(self.path))

Изменение использования eventStream вместо простого system будет необходимо после обновления до более поздней версии, поскольку другое изменение заключалось в том, что имя системы теперь будет добавлено к простым категориям журналирования при передаче в систему. Предположим, system.name == "Fred":

val log = Logging(context.system, "testa") // will log as "testa(Fred)"
1 голос
/ 13 апреля 2014

Akka Logging плохо интегрируется с Play из коробки. Он также использует другой API для slf4j, например предупреждение вместо предупреждения, затрудняя замену в случае необходимости.

Признак ниже заставляет классическую структуру имени пакета slf4j / log4j упростить настройку регистраторов в application.conf

import org.slf4j.LoggerFactory
import akka.actor.ActorRef

trait ActorLogger {
  implicit val self:ActorRef
  protected val log = LoggerFactory.getLogger(getClass().getName() + "_" + self.path.toString())
}

и используйте его вот так

class Foo extends Actor with ActorLogger {
  def run = {
    log.info("hi")
    log.warn("hi")
  }
}
...