2011-06-19 75 views
0

當我的應用程序啓動時,我已將logcat重定向到我的代碼中的文件。 但是,當我的應用程序重新啓動時,重定向代碼再次運行,結果是日誌中的每一行都會被寫入兩次。Logcat被重定向到多個文件

如何執行命令並確保子進程在父進程死亡時死亡?

String.format("logcat -f %s -r %d", filename.getAbsolutePath(), LOG_FILE_SIZE_KB);  
Runtime.getRuntime().exec(cmd); 

我怎樣才能確保我的應用程序的logcat的重定向只有一次? (如果其他應用程序調用logcat並將其重定向到它自己的文件,會發現檢查仍然有效嗎?)

謝謝!

+0

爲什麼你需要將它重定向到一個文件?並請顯示一些代碼。 –

+0

我需要將文件發送到服務器。我添加了重定向的代碼。你怎麼看? – Adibe7

+0

LogCat旨在在您的開發環境中進行調試。如果應用程序在用戶設備上崩潰並且位於Market上,則用戶可以向您發送堆棧跟蹤。無論如何,你能展示你使用這段代碼的全部方法嗎? (我想這是'onCreate')。 –

回答

-1
/** Redirects the log output to the SDCard. 
* 
* make sure your app has the WRITE_EXTERNAL_STORAGE and READ_LOGS permissions - 
* or it won't allow it to read logs and write them to the sdcard. 
* If the application doesn't have the permissions, there will be no exception 
* and the program will continue regularly. 
*/ 
public static void redirectOutputToFile() 
{ 
    s_enableLogs = true; 

    if (s_logcatProcess != null) 
    { 
     Logger log = new Logger("Logger"); 

     log.info("redirectOutputToFile() called more then once, perhaps from service onCreate and onStart."); 

     return; 
    } 

    try 
    { 
     String path = Environment.getExternalStorageDirectory() + LOG_FILE_NAME; 
     File filename = new File(path); 

     filename.createNewFile(); 

     //http://www.linuxtopia.org/online_books/android/devguide/guide/developing/tools/android_adb_logcatoptions.html 
     String cmd = String.format("logcat -v time -f %s -r %d -n %d", filename.getAbsolutePath(), LOG_FILE_SIZE_KB, LOG_FILE_ROTATIONS);  

     s_logcatProcess = Runtime.getRuntime().exec(cmd); 
    } 
    catch (IOException e) 
    {  
     Logger log = new Logger("Logger"); 
     log.exception(e); 
    } 
} 

/** Kills the logcat process that was created in the redirectOutputToFile() method. */ 
public static void killLogcatProcess() 
{ 
    // first update the log mode state 
    s_enableLogs = false; 

    if (s_logcatProcess != null) 
    { 
     s_logcatProcess.destroy(); 
     s_logcatProcess = null; 
    } 
} 
+0

-1這是可怕的代碼和一個可怕的答案:1)'Environment.getExternalStorageDirectory()+ LOG_FILE_NAME;'使用'File'構造函數接受'File'和'String'。 2)在1.5+中使用一個'ProcessBuilder',這反過來使它更容易一步。3)實現*所有的*當[Runtime.exec()不會](http://www.javaworld的.com /和javaworld/JW-12-2000/JW-1229-traps.html)。 –

1

如果您僅使用LogCat進行調試,則可能需要閱讀this

激活LogCat之後,您可以在Eclipse中打開LogCat-View,它會向您顯示所有LogCat-Output,因此您無需首先將它寫入文件。

+0

我需要這些文件,因爲我將它們發送到服務器。我想使用真實的設備進行測試,是否沒有正常的方法來檢查logcat是否已被重定向到文件? – Adibe7

+0

如果您想使用硬件設備,您可能需要閱讀[this](http://developer.android.com/guide/developing/device.html)。 –

1

兩個選項:
a)創建一個靜態全局變量,其中包含信息天氣Logcat已被重定向或不被重定向。
b)在包含信息天氣的SD卡或應用程序目錄(xml或屬性文件)中創建一個文件LogCat已被重定向。