¿Cómo usar de forma segura android-logging-log4j al escribir registros en el almacenamiento externo (tarjeta SD)?

Como usuario de log4j desde hace mucho tiempo, realmente disfruta encontrar que log4j está disponible en Android con la ayuda de este proyecto https://code.google.com/p/android-logging-log4j/

Para mis proyectos actuales de Android, estoy escribiendo registros tanto en logcat como en un archivo en la tarjeta SD, y el archivo de registro es de gran valor para mi proyecto.

Pero algunos comentarios recientes de mis usuarios de pruebas beta revelaron que si se quita la tarjeta SD mientras mi aplicación escribe registros, provocará un cierre forzado.

Mi solución actual es detectar si el almacenamiento externo está montado cuando se usa log4j por primera vez; Si no se detecta almacenamiento externo, deshabilitaré la salida del archivo de registro.

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;
    }
}

Está lejos de ser una solución perfecta y, en realidad, no resolverá mi problema actual con el bloqueo de log4j, porque no puedo decidir cuándo los usuarios intentan desmontar la tarjeta SD.

¿O debería hacer una envoltura alrededor de log4j e implementar la lógica de detección de almacenamiento allí?

Respuesta 1

siempre puede escuchar los eventos de la tarjeta sd y reconfigurar log4j en consecuencia.

<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>

esto le permitirá reconfigurar log4j cuando se retire la tarjeta (probablemente pueda usar el almacenamiento interno del dispositivo hasta el momento en que vuelva a insertar una tarjeta SD).

El SdCardEventListenerdebería extenderse BroadcastReceivery luego reconfigurar el registrador según sea necesario.

Respuesta: 2

Estoy tratando de recuperar una instancia de una clase LocationManager (obtengo información relacionada con GPS). He usado una clase simple para hacerlo, pero terminó dándome un error No se puede hacer una estática ...

Estoy desarrollando un script de shell Groovy que se inicia con frecuencia (haciendo tareas bastante pequeñas), por lo tanto, necesito un tiempo de inicio JVM rápido. Para lograr eso, estoy tratando de lanzarlo con Nailgun. Yo tengo ...

Se informa el siguiente error cuando intento ejecutar una prueba JUnit 5 simple en IntelliJ: 08 de febrero de 2019 3:37:39 PM org.junit.platform.launcher.core.DefaultLauncher handleThrowable ADVERTENCIA: TestEngine ...

Por curiosidad, medí el rendimiento entre el bloque estático y el inicializador del método estático. Primero, implementé los métodos mencionados anteriormente en dos clases Java separadas, así: Primero: clase ...