Я написал собственный регистратор для akka, чтобы передавать сообщения журнала в удаленную систему. У меня есть второй регистратор на месте, используя slf4j с logback в качестве backend для печати на консоль и файл журнала.Akka custom logger не получает сообщений
Странная вещь, которую я заметил, это то, что некоторые сообщения не принимаются моим пользовательским регистратором, но slf4j получает их просто отлично.
, например, сообщения об ошибках, генерируемых неисправный ребенок актером, которые получают вошедший в рамках стратегии контроля:
[DEBUG][akka://Test/system/remote-deployment-watcher]: started ([email protected])
[DEBUG][akka://Test/system]: now supervising Actor[akka://Test/system/deadLetterListener#-286980524]
started ([email protected])
now supervising Actor[akka://Test/system/deadLetterListener#-286980524]
[DEBUG][akka://Test/system/deadLetterListener]: started ([email protected])
started ([email protected])
started ([email protected])
[DEBUG][akka://Test/system/remote-watcher]: started ([email protected])
now supervising TestActor[akka://Test/user/$$a]
[DEBUG][akka://Test/user]: now supervising TestActor[akka://Test/user/$$a]
started ([email protected])
now supervising Actor[akka://Test/user/$$a/refresher#-138594901]
[DEBUG][akka://Test/user/$$a]: started ([email protected])
[DEBUG][akka://Test/user/$$a]: now supervising Actor[akka://Test/user/$$a/refresher#-138594901]
akka.tcp://[email protected]:2552/user/$$a: im an error
[ERROR][akka.tcp://[email protected]:2552/user/$$a]: im an error
stopped
[ERROR][akka://Test/user/$$a/refresher]: exception during creation
akka.actor.ActorInitializationException: exception during creation
at akka.actor.ActorInitializationException$.apply(Actor.scala:164) ~[akka-actor_2.10-2.3.5.jar:na]
...
Для отладки моего пользовательского регистратора печатает полученные сообщения на консоль. Сообщения с предварительно заданным уровнем журнала генерируются slf4j, а те, которые находятся между ними, которые содержат только сообщение, генерируются моим пользовательским регистратором.
Как вы можете видеть, мой пользовательский логгер получает отладочные сообщения только штрафа и даже сообщение об ошибке «im the error», который я сгенерировал вручную, но не является автоматическим сообщением, генерируемым исключением.
Нужно ли подписывать регистратор на дополнительные мероприятия, чтобы получить их? Или в чем проблема?
Мой регистратор:
class MonitoringLogger extends Actor {
val mon = context.actorOf(Props[MonitorEndpoint], "MonitorEndpoint")
def receive = {
case InitializeLogger(bus) => sender ! LoggerInitialized
case Error(cause, logSource, logClass, message: String) =>
println(message)
mon ! format(logSource, message, Console.RED)
case Warning(logSource, logClass, message: String) => mon ! format(logSource, message, Console.YELLOW)
case Info(logSource, logClass, message: String) => mon ! format(logSource, message, Console.GREEN)
case Debug(logSource, logClass, message: String) =>
println(message)
mon ! format(logSource, message, Console.GREEN)
}
def format(src: String, msg: String, code: String) = s"${Console.BLUE}R> $code[${src.split('/').last}] ${Console.RESET}$msg"
}
Interresting часть application.conf:
akka {
loggers = ["akka.event.slf4j.Slf4jLogger", "package.MonitoringLogger"]
loglevel = "DEBUG"
log-dead-letters-during-shutdown = off
log-dead-letters = 10
actor.debug {
lifecycle = on
}
}
Можете ли вы поделиться кодом для своего регистратора? – cmbaxter
@cmbaxter я конечно могу. – mgttlinger
Я предполагаю, что у вас есть необработанный случай. Попробуйте добавить «case other =>», а затем напечатайте «другой», чтобы увидеть, есть ли другой тип сообщения для того, что вам не хватает. – cmbaxter