3

長年の log4j ユーザーとして、このプロジェクトhttps://code.google.com/p/android-logging-log4j/の助けを借りて log4j が Android で利用可能であることを見つけるのは本当に楽しいことです。

私の現在の Android プロジェクトでは、logcat と SD カード上のファイルの両方にログを書き込んでおり、ログ ファイルは私のプロジェクトにとって非常に価値があります。

しかし、ベータ テスト ユーザーからの最近のフィードバックによると、アプリケーションがログを書き込んでいる間に SD カードが取り外されると、強制終了が発生することが明らかになりました。

私の現在の解決策は、log4j が最初に使用されたときに外部ストレージがマウントされているかどうかを検出することです。外部ストレージが検出されない場合は、ログ ファイルの出力を無効にします。

import java.io.File;

import org.apache.log4j.Level;

import android.os.Environment;
import de.mindpipe.android.logging.log4j.LogConfigurator;

public class ConfigureLog4j {
    private static boolean configured = false;

    public static void configure() {
        if (configured == true) {
            return;
        }

        String status = Environment.getExternalStorageState();

        final LogConfigurator logConfigurator = new LogConfigurator();

        if (status.equals(Environment.MEDIA_MOUNTED)) {
            logConfigurator.setUseFileAppender(true);
            logConfigurator.setFileName(Environment.getExternalStorageDirectory() + File.separator + "msgant.log");
        } else {
            logConfigurator.setUseFileAppender(false);
        }
        logConfigurator.setRootLevel(Level.DEBUG);
        // Set log level of a specific logger
        logConfigurator.setLevel("org.apache", Level.ERROR);
        logConfigurator.configure();

        configured = true;
    }
}

これは完璧な解決策にはほど遠いものであり、実際には、log4j のクラッシュに関する現在の問題は解決されません。ユーザーがいつ SD カードをアンマウントしようとするかを判断できないからです。

または、log4j のラッパーを作成し、そこにストレージ検出ロジックを実装する必要がありますか?

4

2 に答える 2

3

いつでも sdcard イベントをリッスンし、それに応じて log4j を再構成できます。

<receiver android:name="com.project.events.SdCardEventListener" >
    <intent-filter>
        <action android:name="android.intent.action.MEDIA_REMOVED" />
        <action android:name="android.intent.action.MEDIA_MOUNTED" />
    </intent-filter>
</receiver>

これにより、カードが取り外されたときに log4j を再構成できます (おそらく、SD カードが再度挿入されるまで、デバイスの内部ストレージを使用できます。

SdCardEventListener必要に応じてロガーを拡張BroadcastReceiverし、再構成する必要があります。

于 2013-01-23T05:38:44.460 に答える
0

サーバーでリッスンしているSocketAppenderに log4j がログを送信するようにします。それに関する唯一の問題はそれIf the remote server is down, the logging requests are simply droppedです。

于 2013-01-23T04:00:06.000 に答える