0

我需要在 GAE/J 上编写自己的日志处理程序。我有我正在尝试调整的 Android 代码,以便它可以在 GAE/J 和 Android 之间共享。我正在尝试编写的 GAE 代码将允许我现有代码中的日志语句在 GAE 上工作。

文档说我可以打印到 system.out 和 system.err,它可以工作,但效果很差。我的日志在日志查看器中显示了太多无关的文本:

2013-03-08 19:37:11.355 [s~satethbreft22/1.365820955097965155].: [my_log_msg]

所以,我开始研究GAE 日志 API。这最初看起来很有希望:我可以构造一个 AppLogLine 并为 RequestLogs 对象设置日志记录。

但是,无法获取当前请求的 RequestLogs 实例 - 文档在这里明确说明

注意:目前 App Engine 不支持使用请求 ID 直接查找相关日志。

我想我可以发明一个新的 requestID 并在其中添加日志行,但它开始看起来好像不是故意的?

是否有人使用此 API 创建自己的日志记录,或以其他方式设法将自己的日志记录到日志控制台。

另外,我在哪里可以找到 GAE 的 java.util.logging 的源代码?这是公开的吗?如果可以的话,我想看看它是如何工作的。

如果我想要做的事情是不可能的,那么我将需要考虑其他选项,例如将我的日志输出写入 FusionTable。

4

1 回答 1

0

我最终只是将我的日志代码分层放在 GAE 的 java.util.logging 之上。这感觉不是最佳的,因为它增加了我的日志记录的复杂性和开销,但我想这是任何 GAE 的第 3 个日志记录框架必须做的(除非在您打印到标准输出时添加的额外内容是可以的)。

这是我的代码的症结所在:

public int println(int priority, String msg) {
    Throwable t = new Throwable();
    StackTraceElement[] stackTrace = t.getStackTrace();

    // Optional: translate from Android log levels to GAE log levels.
    final Level[] levels = { Level.FINEST, Level.FINER, Level.FINE, Level.CONFIG,Level.INFO, Level.WARNING, Level.SEVERE, Level.SEVERE };
    Level level = levels[priority];

    LogRecord lr = new LogRecord(level, msg);
    if (stackTrace.length > 2) { // should always be true
        lr.setSourceClassName(stackTrace[2].getClassName());
        lr.setSourceMethodName(stackTrace[2].getMethodName());
    }
    log.log(lr);
    return 0;
}

请注意,我使用的堆栈深度为 2,但 # 将取决于您的日志记录代码的“深度”。

我希望 Google 最终会支持获取当前的 com.google.appengine.api.log.RequestLogs 实例并将我们自己的 AppLogLine 实例插入其中。(API 确实可以做到这一点,但他们明确不支持它,如上所述。)

于 2013-03-19T17:40:45.727 回答