4

Google App Engine 使用java.util.logging.Logger(JUL) 进行所有日志记录。因此,要记录任何内容(然后通过 检索它LogService),您只需像通常使用 JUL 一样进行记录:

private Logger logger = Logger.getLogger(this.class.getName());

// ...

public void doWhatever() {
    logger.info("This will be logged.");
}

但是,如果您阅读 GAE 教程/指南以了解他们的各种服务 API(Memcache、Mail、Datastore 等),他们都会重申您应该始终针对其中一项服务出现故障的可能性进行编码。GAE 甚至提供了一个CapabilitiesService您可以在调用任何服务方法之前检查的方法,以查看该服务当前是否已启用。

所以我问:JUL 日志记录操作是否有可能失败:

logger.info("我能不能失败而不被记录?");

如果不是,为什么?如果是这样,在 JUL 阻塞的情况下,我该怎么做才能“故障转移”?提前致谢。

4

3 回答 3

2
logger.info("Can I ever fail and not get logged?");

当然也可能失败。

这条看似无辜的线背后的配置可能:

  • 向控制台写入消息(控制台写入可能尚未初始化,或者已经关闭)
  • 将消息附加到文件(可能由于许多与文件 I/O 相关的原因而失败)
  • 发送电子邮件(可能由于许多与套接字 I/O 相关的原因而失败)
  • 写入数据库(可能由于许多与数据库相关的原因而失败)
于 2013-02-04T22:33:33.820 回答
1

如果您一直在崩溃并试图解决问题,一个选择是将异步 HTTP 调用(作为日志机制)发送到另一台服务器。


此外,因为这让我在数周的崩溃地狱中微笑: https ://groups.google.com/d/msg/google-appengine/js5CeRWLQZ0/KrW2CpJ4JuYJ

在大多数系统中,正常运行时间是 100% 减去所有其他系统的停机时间的总和。此规则的例外是日志记录。当 Logging 无法记录停机时间时,Uptime 会增加。因此,Google 一直在努力构建一个日志系统,该系统在所有其他系统之前就出现故障,并在不久之后出现。

于 2013-02-11T14:45:48.810 回答
1

我遇到了同样的问题,的,日志服务可以失败而没有错误。您将得到的最好的结果(直到 GAE 改进日志服务 API)是 cron 一个作业来唤醒,比如说,每分钟,并执行一个logger.info(...).

然后运行LoggingService#fetchLogs(...)​​, filters 以仅检索AppLogLine包含最近的记录器调用,并检查以确保您可以检索它。如果你不能,那么就logger.info(...)失败了,你可以让你的应用程序做出你喜欢的反应。

我总是在我的 GAE 应用程序上公开一个安全的 servlet,它会 ping 功能服务并要求对每个服务进行状态检查。如果该服务因维护而被禁用或关闭,我有一个外部监视器(每 5 分钟检查一次此 URL)向我发送一条短信。您可以将此“日志检查”cron 作业与这种服务检查联系起来。

于 2013-02-11T19:17:19.070 回答