2008-09-23 47 views
17

j2me有什麼日誌記錄解決方案?登錄J2ME

我特別感興趣的是輕鬆排除「發佈」版本的日誌記錄,以便擁有更小的內存封裝&內存佔用。

回答

12

如果您使用的預處理和混淆使用ProGuard,那麼你可以有一個簡單的日誌類。

public class Log { 
    public static void debug(final String message) { 
    //#if !release.build 
    System.out.println(message); 
    //#endif 
    } 
} 

或者做記錄你需要的地方。現在,如果release.build屬性設置爲true,則此代碼將被註釋掉,這將導致一個空方法。 Proguard將刪除空方法的所有用法 - 實際上,發佈版本將刪除所有調試消息。

編輯:

關於它的庫級別(我工作的測繪J2ME庫)我有,也許發現了一個更好的解決方案的思考。

public class Log { 
    private static boolean showDebug; 

    public static void debug(final String message) { 
    if (showDebug) { 
     System.out.println(message); 
    } 
    } 

    public static void setShowDebug(final boolean show) { 
    showDebug = show; 
    } 
} 

這樣最終開發可以使庫內他/她感興趣的日誌級別。如果沒有將被啓用,所有日誌記錄代碼將在最終產品混淆被刪除。甜:)

/JaanusSiim

+0

第二個版本中的代碼會被刪除嗎?您已刪除預處理命令 – Casebash 2010-04-16 02:12:32

1

我已將MIDPLogger用於生產應用程序中的某些可接受的級別,但我發現它在集成到應用程序中之後具有更多用途,而不是作爲套件中的另一個MIDlet等。我也發現了MicroLog,但沒有用過它的任何細節。

19

MicroLog肯定會下注。它是Log4j等Java ME(J2ME)的一個小型日誌記錄庫。它支持記錄到控制檯,文件,RecordStore,Canvas,表單,藍牙,串口(藍牙,IR,USB),Socket(包括SSL),UDP,Syslog,MMS,SMS,電子郵件或Amazon S3 。

http://sourceforge.net/projects/microlog/

+0

MicroLog看起來很不錯,但它需要CLDC 1.1 – Casebash 2010-04-16 02:12:59

+1

我發現了一個名爲[J4me](http://code.google.com/p/j4me/wiki/Logging)的庫,可以在任何設備上運行。 Microlog看起來更好,如果你可以管理它,雖然 – Casebash 2010-04-16 02:32:51

+0

其實,J4me看起來太簡單了我的需求(只真的提供日誌級別)。我想我會用Proguard推出我自己的產品 – Casebash 2010-04-16 02:41:35

3

具有由Symbian修改的太陽虛擬機中的Series60和UIQ手機本身擁有標準輸出重定向。

不僅可以捕獲System.out,而且Throwable.printStackTrace()也可以工作。在早期的手機上,您需要編寫一個掛鉤到標準庫服務器進程的C++應用程序。 Symbian製作了可以將VM標準輸出捕獲到控制檯或文件的重定向器應用程序。

在新手機上,引入了一個「redirect://」GCF協議,可以將VM標準輸出讀取到Java byte []或String對象中(您希望在單獨的MIDlet中執行該操作)和重定向器應用程序在Java中被重寫。

在Series60 3rd Edition Feature Pack 2手機(及更高版本)中使用的最新J9 VM上,您可能需要嘗試使用「redirect:// test」。

7

可以使用-assumenosideaffects中的ProGuard到completley刪除您的日誌類:

-assumenosideeffects public class logger.Logger {*;} 

而不是必須預處理。

0

我寫了一個字節碼優化,因爲類文件的格式,你可以指向類名&功能的UTF編碼,這可以讓你的輸出日誌與MyClass.someFunc()(您可以處理的簽名,如果你想獲取類型),它允許你做類似C風格的調試使用LINE & FILE宏。

0

使用記錄器類的條件編譯並不能解決完全刪除日誌語句的問題,因爲您經常記錄的不僅僅是一個簡單的字符串。您將查找變量值,然後將它們組合爲字符串,例如:WhateverLog.log(「Loaded」+ someclass.size()+「foos」)。

現在,如果您只留下WhateverLog.log的主體(如接受的解決方案所示),您仍然會留下大量不必要的代碼,包括字符串連接(並因此創建StringBuffer)。這就是爲什麼你最好使用像proguard這樣的字節碼後處理工具(已經提到過)。 Proguard的-assumenosideeffects將允許其優化器不僅刪除日誌記錄,而且還刪除所有隻有日誌記錄調用纔會使用的代碼。

0

J2ME的LWUIT框架提供了Logging表單,它可以有一個日誌裏面的語句。您可以在您認爲可能產生異常的每個地方添加日誌。

示例:Log.getInstance()。showLog(); 通過添加上述行,您可以跟蹤J2ME設備中的日誌記錄。