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應該是同一個實例。
謝謝你的評論。 我編輯了我的帖子,向您展示了我的示例用法。我會考慮你的提示:) –