2013-03-09 69 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實際上就是這樣做的,但它們明確不支持它,如上所述。)

相關問題