2013-03-09 27 views
0

我需要在GAE/J上编写我自己的日志处理程序。我正在尝试修改Android代码,以便它可以在GAE/J和Android之间共享。我试图写的GAE代码将允许现有代码中的日志语句在GAE上工作。我自己的GAE/J日志处理程序(使用appengine.api.log?)

该文档说,我可以打印到system.out和system.err,它的工作原理,但很糟糕。我的记录显示了在日志查看器有太多的附加文本:

2013年3月8日19:37:11.355 [S〜satethbreft22/1.365820955097965155]:[my_log_msg]

所以,我开始看着the GAE log API。这看起来很有希望:我可以构建AppLogLine并为RequestLogs对象设置日志记录。

然而,有没有办法让当前请求的RequestLogs实例 - 文档说这样explicitly here

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

我想我可以发明一个新的requestID并添加日志行,但它开始看起来像这只是不是意味着什么?

是否有人使用此API来创建自己的日志记录,或者是否有人设法将自己的日志记录到日志控制台。

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

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

回答

0

我最后只是在GAE的java.util.logging之上分层了我的日志代码。这感觉是非最优的,因为它增加了我的日志记录的复杂性和开销,但我想这是GAE的任何第三种日志记录框架必须做的事情(除非在打印到stdout时添加额外的cruft才行)。

这里是我的代码的症结:

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实际上就是这样做的,但它们明确不支持它,如上所述。)

相关问题