logcat停止写入设备上的文件

时间:2018-06-20 07:23:32

标签: android logcat android-logcat

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

此代码可以正常工作,除非在一段时间,几小时或几天后它会随机停止保存日志。

可能是什么原因导致的,如何解决?

2 个答案:

答案 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平板电脑上。