logcat 停止写入设备上的文件

logcat stops writing to file on device

对于 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();
    }

这段代码工作正常,除了在一段时间、几小时或几天后它随机停止保存日志。

这可能是什么原因造成的,我该如何解决?

我认为您应该先检查权限。您可能正在棉花糖及更高版本中测试应用程序。请尝试以下代码,让我知道它是否适合您:

    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/

问题是该应用使用了执行 javascript 请求的浏览器。偶尔这些请求会失败,但它们从未被清理过,因为没有响应。这个特定的应用程序是 24/7 全天候运行,这意味着它无法以正常方式清除这些请求。因为这个浏览器正在使用它自己的沙箱,所以当发生这种情况时不会抛出任何错误,但在某些时候内存会填满导致它没有剩余内存来继续记录。因此没有记录没有内存的问题。这种情况下的修复是每 6 小时清除并重新启动应用内浏览器,从而解决了问题。

这只发生在具有特定 Android 版本的特定西门子平板电脑上。