2010-11-08 224 views
22

我在配置Android日誌記錄方面有點困難。以下是我的代碼的樣子:Android日誌記錄級別

if (Log.isLoggable("MY_TAG", Log.VERBOSE)) { 
     Log.v("MY_TAG", "Here's a log message"); 
    } 

很簡單吧?

但是,我很難讓Log.isLoggable("MY_TAG", Log.VERBOSE)返回true。

http://developer.android.com/reference/android/util/Log.html,我嘗試添加一個local.prop文件到/ data /目錄,看起來像這樣:

log.tag.MY_TAG=VERBOSE 

,但沒有運氣。我也試過:

System.setProperty("log.tag.MY_TAG", String.valueOf(Log.VERBOSE)); 

但這也行不通。

任何想法,我在做什麼錯在這裏?我在Nexus 1上運行Android 2.1-update1,如果這有什麼區別的話。

回答

30

嘗試

adb shell setprop log.tag.MyAppTag VERBOSE 
+2

This Works !!!如果您可以通過Java中的System.setProperty調用來更改這些shell屬性,那將非常可愛。 – seanoshea 2010-11-09 21:25:15

+1

請記住設備重新啓動後重置的屬性值。所以如果你需要的話,你必須再次輸入命令。 – 2014-10-01 23:22:24

+0

如果您有應用程序Tasker(Play商店中有幾塊錢),您可以在設備引導時通過創建一個新的配置文件來運行此命令,該配置文件包含event = System> Device Boot和任務代碼> Run Shell with command =「setprop log.tag.MyAppTag VERBOSE「。我必須以root身份運行該命令(勾選Tasker中的方框)才能使其運行。 – 2015-01-16 08:12:00

9

一個重要目標是不發貨一噸留在它的日誌呼叫的生產程序,提高其規模,甚至可能影響甚至它的性能。

要做到這一點,我的建議是把這些常量在每個類的是將有日誌調用上:

static final boolean DEBUG = false; 
static final String TAG = "<MyClass>" 

現在,你登錄,這樣做:

if (DEBUG) Log.v(TAG, "Something"); 

通過將DEBUG常數更改爲true來打開您的日誌。 (如果你願意的話,你可以讓一個類擁有這些靜態的代碼來使用你的所有應用程序的代碼......這對於一個小應用程序來說是有意義的,但是隨着事情變得越來越大,決定使用哪些部分來記錄日誌就非常好。)

通過這樣做,當您使用DEBUG = false構建應用程序時,您的所有日誌記錄代碼不僅不會被執行,還會被完全剝離出您的應用程序。這很好,因爲它允許您在代碼中保留相當廣泛的日誌記錄,以便在需要時啓用它,而不必擔心這會如何影響運輸應用程序的大小。基本上只需要在任何需要它們的地方扔日誌,不用擔心把它們留在裏面。

這是很多Android框架所採用的方法。例如,Activity ManagerService

這些常數位於頂部,各種日誌行都基於它們灑落。 (以及其他各種子調試常量,因爲這個文件是荒謬的愚蠢地大。)

+5

請注意,您可以在最新版本的開發工具(絕對在R20及更高版本)中使用'BuildConfig.DEBUG',而不是您自己的'DEBUG'。 – CommonsWare 2012-12-11 15:59:40

+1

@hackbod那麼當測試人員報告某些內容時,我們將如何查看日誌並期望找到任何內容?在運行時打開DEBUG會更好 - 但是如何? – likejiujitsu 2015-06-09 15:26:43

17

看來,更高版本的Android希望/data/local.prop只能寫入根。 adb push命令似乎最初創建文件時授予每個人讀/寫訪問權限(因爲默認文件掩碼是777)。 Android明智地忽略了/data/local.prop,因爲這可能是安全風險。

我只嘗試過Android 2.3.3和4.1.2。前者在閱讀世界可寫的local.prop時沒有問題,而後者似乎默默無視文件的內容。

創建local.prop文件,如原來的問題描述:

log.tag.MY_TAG=VERBOSE 

然後將其推到設備如下似乎這樣的伎倆:

adb push local.prop /data/local.prop 
adb shell chmod 644 /data/local.prop 
adb shell chown root.root /data/local.prop 
adb reboot 

你可以仔細檢查,以確定local.prop中的值是通過執行來讀取的:

adb shell getprop | grep log.tag 

綜上所述:

  • /data/local.prop只在啓動過程中被讀取。
  • Android的更新版本似乎要求必須正確設置/data/local.prop文件的權限,否則將不會被讀取。該文件只能由root用戶寫入。

使用adb shell setprop log.tag.MyAppTag VERBOSE也工作。問題是重新啓動後屬性值會丟失。

+2

是否有辦法爲所有日誌標記執行此操作,而不是明確地指出每個日誌標記?我正在研究一個標籤通常設置爲類名的應用程序,因此有很多標籤。 – markproxy 2015-03-19 21:46:27