3

作为一个长期使用 log4j 的用户,在这个项目https://code.google.com/p/android-logging-log4j/的帮助下发现 log4j 在 Android 上可用真的很开心

对于我当前的 Android 项目,我将日志写入 logcat 和 SD 卡上的文件,日志文件对我的项目具有很大的价值。

但是最近我的 beta 测试用户的一些反馈显示,如果在我的应用程序写入日志时移除 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

我会让 log4j 将日志发送到在您的服务器上侦听的SocketAppender 。唯一的问题是If the remote server is down, the logging requests are simply dropped.

于 2013-01-23T04:00:06.000 回答