在Android中的外部存储上创建日志文件。有没有正确的方法呢?

时间:2015-07-10 07:53:49

标签: android logging error-logging

现在我正在创建一个在发布版本中使用添加的proguard进行测试的应用。 正如您可能想象的那样,我编写和测试的内容与人们使用的内容之间存在一些差异。有时我会得到一个错误报告,说某些东西不起作用。嗯......它对我有用,对吗?

所以,我的想法是编写某种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 个答案:

答案 0 :(得分:1)

没有正式的方法可以做到这一点。

看看这2个图书馆:HugoTimber

您的代码有几个问题:

  • 当登录到Logcat时,你也应该在你的代码中登录文件 你没有登录到logcat,didint正确包装它。所以在每一点上 要记录到文件,您将需要两行。浪费时间 和代码。
  • 你没有添加使用样本,因此我真的不知道怎么样 你拥有的 LogManager 的对象,你不应该有一个以上 处理日志。
  • 没有批处理文件。不要写入文件 每次你需要登录但批量。它。
  • 当然,批处理同步会更容易 完成。
  • 在此实现中,从您正在写入的UI线程进行日志记录时 文件,这是不好的做法。不要在UI线程上进行任何读/写操作。

结论 - 你有很多工作要做。这些提示将帮助您创建正确的记录器。