有没有办法从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是关于什么......
答案 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。他们有一个准备好登录文件的解决方案。
答案 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
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());