簡體   English   中英

Logback-android和ACRA

[英]Logback-android and ACRA

我正在嘗試設置我的應用程序,以便我可以使用logback-android編寫日志,然后使用ACRA將它們發送到Google Docs。 我認為這是可能的,但我遇到的一個問題是在哪里寫日志。

兩個庫都需要一個硬編碼的文件名,所以我不能使用getStorageDirectory() 所以,我的第一個問題是,如果你沒有指定完整路徑,那么日志會寫在哪里? 我是否必須指定完整路徑並將其硬編碼到/data/data/com.example/...

這是我的配置:

<!-- Logback configuration. -->
<logback>
<configuration>
    <appender
        name="FILE"
        class="ch.qos.logback.core.FileAppender" >
        <file>applog.log</file>
        <encoder>
            <pattern>[%method] %msg%n</pattern>
        </encoder>
    </appender>
    <appender
        name="LOGCAT"
        class="ch.qos.logback.classic.android.LogcatAppender" >
        <tagEncoder>
            <pattern>%logger{0}</pattern>
        </tagEncoder>

        <encoder>
            <pattern>[%method] %msg%n</pattern>
        </encoder>
    </appender>

    <root level="debug" >
        <appender-ref ref="FILE" />
        <appender-ref ref="LOGCAT" />
    </root>
</configuration>
</logback>

對於acra:

@ReportsCrashes(formKey = "dDB4dVRlTjVWa05T..........................",
                applicationLogFile = "applog.log",
                applicationLogFileLines = 150)

但這會產生如下錯誤,所以顯然我需要一個絕對路徑。 我該怎么用?

java.io.FileNotFoundException: /applog.log: open failed: EROFS (Read-only file system)

最后,稍微不相關的問題,我希望能夠打印對象地址,例如[%object ::%method],它會顯示[MyActivity @ 33c0d9d :: onCreate]或類似的東西。 有沒有辦法做到這一點?

這不是解決方案,而是替代方案。

如果您有自己的日志記錄層,則可以將最后的50/100/500日志消息存儲在循環緩沖區中,並在發生崩潰時將其提供給ACRA。

循環緩沖區impl示例:

public static final class LogRingBuffer {
    public static final int CAPACITY = 150;
    private String[] buffer = new String[CAPACITY];
    private int position = 0;
    private boolean full = false;
    public synchronized void append(String message) {cost of sync
        buffer[position] = message;
        position = (position+1)%CAPACITY;
        if (position==0) {
            full = true;
        }
    }

    public synchronized int size() {
        return full?CAPACITY:position;
    }

    public synchronized String get(int i) {
        return buffer[(position - i - 1 + CAPACITY) % CAPACITY];
    }
}

然后,您必須提供日志內容作為自定義數據字段:

int bcSize = Log.logBuffer.size();
for(int i=0; i<bcSize; ++i)
    reporter.addCustomData(String.format("LOG%03d", i), Log.logBuffer.get(i));

后一個應該在你自己的異常處理程序中實現,它應該包含ACRAs異常處理程序...

我承認,這不是愚蠢的簡單,但可以節省一些DISK I / O,並使用logback-android ...

還有另一種解決方法。

看看ACRA源代碼,文件LogFileCollector.java 它以下列方式打開應用程序日志文件:

if (fileName.contains("/")) {
    reader = new BufferedReader(new InputStreamReader(new FileInputStream(fileName)), 1024);
} else {
    reader = new BufferedReader(new InputStreamReader(context.openFileInput(fileName)), 1024);
}

可以使用context.openFileOutput來保存日志消息,並在ACRA配置中指定不帶路徑的日志文件名。 即日志文件類可以按以下方式聲明:

public class LogOnDisk {
    public static final String LOG_FILE_NAME = "custom_log";
    private final java.io.FileOutputStream _FS;
    private final java.io.PrintStream _PS;
    public LogOnDisk(Context context) throws IOException {
        _FS = context.openFileOutput(LOG_FILE_NAME, Context.MODE_PRIVATE);
        _PS = new PrintStream(_FS);
    }

    public synchronized void toLog(String message) {
        try {           
            _PS.print(message + "\n");
            _PS.flush();
        } catch (Exception ex) {
            //nothing to do
        }
    }       
}

ACRA配置:

@ReportsCrashes(applicationLogFile = LogOnDisk.LOG_FILE_NAME)
public final class Kernel extends Application {

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM