对于一个android应用程序,我将日志保存在设备本身上,以便在出现问题时可以查明它们是什么。该设备在没有互联网的环境中运行,因此不能远程写入日志。
以下代码首先清除缓冲区,然后连续将记录的内容写入“ logFile”。
try {
Process process = Runtime.getRuntime().exec("logcat -c"); // -c clear buffer.
process = Runtime.getRuntime().exec("logcat -f " + logFile + " -r 5120 -n 30"); // -r amount of bits to write, -n amount of logs to rotate
} catch ( IOException e ) {
e.printStackTrace();
}
此代码可以正常工作,除非在一段时间,几小时或几天后它会随机停止保存日志。
可能是什么原因导致的,如何解决?
答案 0 :(得分:0)
我认为您应该先检查权限。可能您正在棉花糖及更高版本中测试该应用程序。请尝试以下代码,让我知道它对您有用:
public class MyProjectApp extends Application {
/**
* Called when the application is starting, before any activity, service, or receiver objects (excluding content providers) have been created.
*/
public void onCreate() {
super.onCreate();
if ( isExternalStorageWritable() ) {
File appDirectory = new File( Environment.getExternalStorageDirectory() + "/MyProjectAppFolder" );
File logDirectory = new File( appDirectory + "/log" );
File logFile = new File( logDirectory, "logcat" + System.currentTimeMillis() + ".txt" );
// create app folder
if ( !appDirectory.exists() ) {
appDirectory.mkdir();
}
// create log folder
if ( !logDirectory.exists() ) {
logDirectory.mkdir();
}
// clear the previous logcat and then write the new one to the file
try {
Process process = Runtime.getRuntime().exec("logcat -c");
process = Runtime.getRuntime().exec("logcat -f " + logFile);
} catch ( IOException e ) {
e.printStackTrace();
}
} else if ( isExternalStorageReadable() ) {
// only readable
} else {
// not accessible
}
}
/* Checks if external storage is available for read and write */
public boolean isExternalStorageWritable() {
String state = Environment.getExternalStorageState();
if ( Environment.MEDIA_MOUNTED.equals( state ) ) {
return true;
}
return false;
}
/* Checks if external storage is available to at least read */
public boolean isExternalStorageReadable() {
String state = Environment.getExternalStorageState();
if ( Environment.MEDIA_MOUNTED.equals( state ) ||
Environment.MEDIA_MOUNTED_READ_ONLY.equals( state ) ) {
return true;
}
return false;
}
}
.manifest文件中需要正确的权限:
<uses-permission android:name="android.permission.READ_LOGS" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
来源 来源:http://www.journal.deviantdev.com/android-log-logcat-to-file-while-runtime/
答案 1 :(得分:0)
问题是该应用使用了执行JavaScript请求的浏览器。有时这些请求失败了,但是由于没有响应而从未清除。这个特定的应用程式是24/7运作,因此无法以正常方式清除这些要求。因为此浏览器正在使用自己的沙箱,所以在发生这种情况时不会引发任何错误,但是在某些时候内存已满,导致没有剩余的内存可以继续进行日志记录。因此,没有记录没有内存的问题。解决方法是每6小时清除并重新启动一次应用内浏览器,从而解决了该问题。
这仅发生在具有特定Android版本的特定Siemens平板电脑上。