记录到Android上的文件

时间:2010-01-22 09:33:46

标签: android logging

有没有办法从Android手机中检索日志消息。

我正在构建一个使用我的HTC Hero的GPS的应用程序。我可以从eclipse运行和调试应用程序,但这不是一个很好的GPS用例,坐在我的办公桌前。

当我四处走动时,当我开启应用程序时,我会出现间歇性异常。无论如何,我可以将这些例外输出到SD卡上的文本文件,或者将Log.x("")的调用输出到文本文件,以便我可以看到异常是什么。

由于

编辑:解决方案

以下是我最终使用的代码......

Thread.currentThread().setUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
    @Override
    public void uncaughtException(Thread thread, Throwable ex) {

    PrintWriter pw;
    try {
        pw = new PrintWriter(
                new FileWriter(Environment.getExternalStorageDirectory()+"/rt.log", true));
        ex.printStackTrace(pw);
        pw.flush();
        pw.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
}
});

我必须包裹

pw = new PrintWriter(new FileWriter(Environment.getExternalStorageDirectory()+"/rt.log", true));

在try / catch中,Eclipse不会让我编译应用程序。它一直在说

Unhandled exception type IOException

1 quick fix
    Sorround with try/catch

所以我做了,这一切都很好,但我确实让我想知道Eclipse是关于什么......

6 个答案:

答案 0 :(得分:18)

您可以使用Thread.setUncaughtExceptionHandler()来捕获例外。

写入SD卡就像使用Environment.getExternalStorageDirectory()检索卡片目录并在那里创建文件一样简单。

File f = new File(Environment.getExternalStorageDirectory(),filename);

您需要向应用程序提供正确的权限才能写入SD卡,方法是将其添加到您的Manifest中:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

答案 1 :(得分:6)

Log4j或slf4j也可以与logcat一起用作Android中的日志框架。查看项目android-logging-log4j。配置日志(旋转)文件非常容易。

 static {
    final LogConfigurator logConfigurator = new LogConfigurator();

    logConfigurator.setFileName(Environment.getExternalStorageDirectory() + "myapp.log");
    logConfigurator.setRootLevel(Level.DEBUG);
    // Set log level of a specific logger
    logConfigurator.setLevel("org.apache", Level.ERROR);
    logConfigurator.configure();
}

答案 2 :(得分:5)

你可以看看microlog4android。他们有一个准备好登录文件的解决方案。

https://github.com/johanlkarlsson/microlog4android

答案 3 :(得分:4)

我尝试了上面的两个选项(microlog4android&amp; android-logging-log4j),他们努力工作。一旦编译好了,我就会得到Runtime java.lang.NoClassDefFoundError。

然后我偶然发现logback-android ......也在这里找到http://logback.qos.ch/

它有更好的指示,我让它在几个小时内完成。

这似乎是适用于Android的最佳日志记录解决方案。

答案 4 :(得分:4)

使用slf4-android创建的BrightInventions lib。这是使用android java.util.logging。*。

slf4j api的简单实现

特点:

  • 开箱即用的文件
  • LoggerConfiguration.configuration().addHandlerToLogger
  • 登录任何其他目的地
  • 摇动您的设备,通过电子邮件发送带有屏幕截图的日志
  • 真的很小,只花了~55kB

slf4android主要由@miensol维护。

在我们的博客上阅读有关slf4android的更多信息:

答案 5 :(得分:1)

基于评论中的@Greg B解决方案和@JPM问题,我在一个单独的类中创建了这个静态方法,每次你实例化一个新线程时,都要调用它。

package com.stackoverflow。

import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;

import android.os.Environment;

public class UnhandledExceptionHandler {

    public static void setUndhandledException(Thread thread) {
        if (thread.getUncaughtExceptionHandler() == null) {
            Thread.currentThread().setUncaughtExceptionHandler(
                    new Thread.UncaughtExceptionHandler() {
                        @Override
                        public void uncaughtException(Thread thread,
                                Throwable ex) {

                            PrintWriter pw;
                            try {
                                pw = new PrintWriter(new FileWriter(Environment
                                        .getExternalStorageDirectory()
                                        + "/rt-networkandgps"
                                        + "/gpx/"
                                        + thread.getId() + ".log", true));
                                ex.printStackTrace(pw);
                                pw.flush();
                                pw.close();
                            } catch (IOException e) {
                                e.printStackTrace();
                            }
                        }
                    });
        }

    }

}

从像这样的任何线程中调用它,

            UnhandledExceptionHandler.setUndhandledException(Thread.currentThread());