0

在 Akka 2.10 下,我的日志配置在关机期间被重置……导致潜在的重要消息被写入标准输出而不是日志机制。

例如,这段代码:

String settings =
        "akka.event-handlers = [\"akka.event.slf4j.Slf4jEventHandler\"]\n" +
        "akka.actor.provider = \"akka.cluster.ClusterActorRefProvider\"";
Config config = ConfigFactory.parseString(settings);
ActorSystem system = ActorSystem.create("testing", config);
LoggingAdapter log = Logging.getLogger(system, new Object());
log.info("Via SlF4J");
system.shutdown();
Thread.sleep(1000);
log.info("After shutdown");

产生这个输出:

17:24:11.999 [testing-akka.actor.default-dispatcher-4] INFO  akka.event.slf4j.Slf4jEventHandler - Slf4jEventHandler started
17:24:12.151 [testing-akka.actor.default-dispatcher-4] INFO  N.168.1.106:2552) - RemoteServerStarted@akka://testing@192.168.1.106:2552
17:24:12.155 [testing-akka.actor.default-dispatcher-4] INFO  java.lang.Object - Via SlF4J
[INFO] [04/12/2013 17:24:12.218] [testing-akka.actor.default-dispatcher-4] [NettyRemoteTransport(akka://testing@192.168.1.106:2552)] RemoteServerShutdown@akka://testing@192.168.1.106:2552
[INFO] [04/12/2013 17:24:13.156] [main] [Object(akka://testing)] After shutdown

前三行输出是通过 SLF4J(我配置的记录器),而最后两行是通过akka.event.Logging$StandardOutLogger-- 这意味着在关闭期间记录的异常(在某些情况下我看到一些)正在丢失到记录器。

(当然,看到 RemoteServerShutdown 消息正确记录也很高兴。)

有人对这种行为有任何见解吗?

4

2 回答 2

1

Akka 的日志记录是建立在 Actor 之上的,由于所有 Actor 在此期间都被关闭,ActorSystem.shutdown()因此它必须在某个时候停止工作。回退到控制台日志记录已经到位,因此非常晚记录的消息仍然没有完全丢失。

您所看到的是,您log.info有时会在关闭日志记录的时间点之前和有时之后进入,因为ActorSystem.shutdown()只是启动关闭然后异步进行。

因此,结论是通过参与者系统进行日志记录应该只在参与者系统内完成,因为这样可以确保事情仍然正常运行。

于 2013-04-13T19:16:19.310 回答
0

这个问题似乎可以通过升级到 Akka 2.10-2.1.2 来解决。

于 2013-04-13T01:36:29.823 回答