2014-09-03 2 views
2

Я написал собственный регистратор для , чтобы передавать сообщения журнала в удаленную систему. У меня есть второй регистратор на месте, используя с в качестве 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 
    } 
} 
+0

Можете ли вы поделиться кодом для своего регистратора? – cmbaxter

+0

@cmbaxter я конечно могу. – mgttlinger

+1

Я предполагаю, что у вас есть необработанный случай. Попробуйте добавить «case other =>», а затем напечатайте «другой», чтобы увидеть, есть ли другой тип сообщения для того, что вам не хватает. – cmbaxter

ответ

1

cmbaxter привело меня к моей ошибке. case class Error, что я матч против определяется как:

case class Error(
    cause: Throwable, 
    logSource: String, 
    logClass: Class[_], 
    message: Any = "") extends LogEvent 

Обратите внимание, что message имеет тип Any но матч против String. Мои собственные сообщения журнала совпадают, потому что я использую строковое сообщение. Автогенерированное событие этого исключения имеет message, установленное на null, так что оно не удовлетворяет заданию.

Смежные вопросы