2015-07-10 35 views
0

現在我正在創建一個應用程序,該應用程序在添加了proguard的發行版本中進行了測試。 正如你可能想象的那樣,我寫和測試的東西和人們使用的東西之間有一些區別。有時我會收到一份錯誤報告,說有些東西不起作用。那麼......它適合我,對吧?在Android中創建外部存儲上的日誌文件。有沒有一個正確的方法來做到這一點?

所以,我的想法是編寫某種LogManager,將新行寫入設備上的文本文件。這是我的實施,從本質上講:

@Application 
public class LogManager { 

private static final String TAG = LogManager.class.getSimpleName(); 
private static final String FOLDER_NAME = "/logs/"; 
private static final String FILE_NAME = "app_logs.txt"; 

DateTime dateTime; 
DateTimeFormatter parser; 
String date; 
FileOutputStream fileOutputStream; 
File logFile; 
Gson gson; 

@Inject 
public LogManager(Gson gson) { 
    parser = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss.SSS"); 
    this.gson = gson; 
    createFile(); 
} 

private void createFile(){ 
    if(isExternalStorageReadable() && isExternalStorageWritable()){ 
     try { 
      File path = new File(Environment.getExternalStorageDirectory().getAbsolutePath()+FOLDER_NAME); 
      path.mkdirs(); 
      logFile = new File(path, FILE_NAME); 
      logFile.createNewFile(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

} 

public void log(Object o){ 
    log(gson.toJson(o)); 
} 

public void log(String text){ 
    dateTime = new DateTime(); 
    date = parser.print(dateTime); 

    String log = date + " " + text; 
    try{ 
     fileOutputStream = new FileOutputStream(logFile, true); 
     fileOutputStream.write(System.getProperty("line.separator").getBytes()); 
     fileOutputStream.write(log.getBytes()); 
     fileOutputStream.close(); 

    }catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

public void printLogs(){ 
    StringBuilder text = new StringBuilder(); 

    try { 
     BufferedReader br = new BufferedReader(new FileReader(logFile)); 
     String line; 

     while ((line = br.readLine()) != null) { 
      text.append(line); 
      text.append('\n'); 
     } 
     br.close(); 
    } 
    catch (IOException e) { 
     e.printStackTrace(); 
    } 

    L.d(TAG, text.toString()); 
} 

public void deleteLog(){ 
    L.d(TAG, "Log File deleted: "+logFile.delete()); 
} 

private boolean isExternalStorageWritable() { 
    String state = Environment.getExternalStorageState(); 
    return Environment.MEDIA_MOUNTED.equals(state); 
} 

private boolean isExternalStorageReadable() { 
    String state = Environment.getExternalStorageState(); 
    return Environment.MEDIA_MOUNTED.equals(state) || Environment.MEDIA_MOUNTED_READ_ONLY.equals(state); 
} 

所以是的。然而,我不確定它在未來如何使用。例如,當我嘗試在不同的踏板上使用它時發生了什麼?我知道我會,因爲我正在異步下載很多東西。

所以,我的問題是...是否有一些「官方」的方式如何處理這個問題?也許某種記錄庫? 或者,也許我的代碼是好的,只需要一些調整?

編輯: 樣本用法。

... 

@Inject 
LogManager logManager; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_userconfig); 
    App.getInstance().appComponent.inject(this); 

    logStuff(); 
} 

private void logStuff(){ 
    logManager.log("abc"); 
    logManager.log("def"); 

    logManager.printLogs(); 
} 

因爲我使用的是Dagger2庫,所以在所有類中注入的LogManager應該是同一個實例。

回答

1

有沒有官方的方式來做到這一點。

看看這2個庫:HugoTimber

與您的代碼的幾個問題:

  • 當洛到logcat的ü也應該記錄到該文件,但在你的代碼 üdidnt登錄到logcat中,didint正確包裹。所以在你想登錄文件的每個點 你都需要兩行。浪費時間 和代碼。
  • 您沒有添加使用的樣本,因此我真的不知道如何處理日誌 LogManager的對象,你不應該有多於一個的 處理日誌。
  • 沒有批量寫入文件。每次需要登錄但不批處理時,不要寫入文件 。它。
  • 當然,當批量同步將更容易達到 完成。
  • 在此實現從UI線程登錄時,您正在寫入 文件,這是不好的做法。不要在UI線程上做任何讀/寫操作。

結論- 你有很多工作要做。這些提示將幫助您創建一個正確的記錄器。

+0

謝謝你的評論。 我編輯了我的帖子,向您展示了我的示例用法。我會考慮你的提示:) –

相關問題