Java 在外部存储器(SD卡)上写入日志时,如何安全使用android-logging-log4j?

Java 在外部存储器(SD卡)上写入日志时,如何安全使用android-logging-log4j?,java,android,logging,log4j,sd-card,Java,Android,Logging,Log4j,Sd Card,作为一个长期使用log4j的用户,在这个项目的帮助下发现log4j可以在Android上使用真的很高兴 对于我目前的Android项目,我正在向logcat和SD卡上的文件写入日志,日志文件对我的项目非常有价值 但我的beta测试用户最近的一些反馈显示,如果在我的应用程序写入日志时移除SD卡,将导致强制关闭 我目前的解决方案是在首次使用log4j时检测是否安装了外部存储器;如果未检测到外部存储,我将禁用日志文件输出 import java.io.File; import org.apache.

作为一个长期使用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周围做一个包装,并在那里实现存储检测逻辑?

我会让log4j将日志发送到服务器上的侦听器。唯一的问题是
如果远程服务器关闭,日志记录请求就会被删除

您可以始终侦听SD卡事件并相应地重新配置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>

这将允许您在卸下SD卡时重新配置log4j(在再次插入SD卡之前,您可能可以使用设备内部存储器)


SdCardEventListener
应该扩展
BroadcastReceiver
,然后根据需要重新配置记录器。

谢谢,对于仅前台使用的应用程序,这可能是合适的,但我当前的应用程序(大量使用后台服务)偶尔会生成日志,这是不可取的。因为如果网络是需要一直收集有意义的日志,这会对设备的用电造成很大的问题。不管怎样,Android上的网络大部分时间都在运行,我看不出这是一个什么问题。嗨,@hd1,空闲网络和活动网络的用电差异很大,你可以试试Android 4.0附带的内置电能表+.无论如何,谢谢你的想法,我肯定会在我的下一个应用程序上试用。谢谢,我现在已经在跟踪这条线索,它看起来很有希望。