2010-05-26 18 views
13

Estoy tratando de calzar un SDK existente en un dispositivo Android y una de las dependencias de dicho SDK es Apache log4j. Puedo cargar mi programa de prueba en el emulador de Android, pero cuando se llama al objeto log4j "PropertySetter", el programa falla con una excepción de verificación. ¿Hay alguna forma de mejorar este problema?log4j soporte en Android

+0

Pedido esta sencilla biblioteca de envoltorio para iniciar la sesión en Android [https://github.com/oronno/log4android](https://github.com/oronno/log4android) –

+0

Echa un vistazo a este proyecto http://nikedlab.com/android-log-rolling-library.html – NikedLab

Respuesta

3

Recomendaría intentar cambiar en slf4j en lugar de log4j. No es un cambio indoloro, pero es probable que sea más fácil que lo que tienes. slf4j proporciona un front-end común para varios registradores incluyendo log4j y hay un paquete slf4j-android.

No, el mecanismo de registro de Android no es decente. Es muy inadecuado en comparación con lo que log4j puede hacer por usted.

13

En realidad, el uso de slf4j resultó ser un proceso notablemente indoloro para mí, y parece ser el caso común, al menos para las bibliotecas que usan funciones sencillas de log4j. En realidad, no es necesario cambiar slf4j por log4j, sólo se suman dos bibliotecas SLF4J a su proyecto de http://www.slf4j.org/download.html:

- la biblioteca slf4j para Android (actualmente SLF4J-android-1.6.1-RC1.jar)
- el puente log4j sobre slf4j (http://www.slf4j.org/legacy.html#log4j-over-slf4j).

Este último define las clases core log4j usadas por las implementaciones típicas y las vincula a la implementación slf4j de Android. Una vez que se agregan las bibliotecas, el código funciona.

+0

Gracias a mí ... (probado) – Hurda

+0

¿Puedes explicar con un poco más de detalle cómo se integra slf4j en su Android ¿proyecto? Intento usar slf4j en un proyecto de Android y estoy teniendo dificultades para configurarlo a través de un archivo log4j.properties o log4j.xml. Ni siquiera estoy seguro de que deba intentar configurar slf4j-for-android con un archivo log4j.properties. Es slf4j-for-android básicamente una envoltura alrededor del registro regular de Android (y como resultado, debería usar la configuración de registro de Android en lugar de lo log4j) – seanoshea

+0

No hay archivo de configuración para slf4j-android, puede configurar el nivel de inicio de sesión cuando se inicia el emulador y cuando está navegando registros a través de logcat – kokosing

5

Logon log4j trabajando satisfactoriamente en android con un Socket Appender y Log4j Chainsaw. Todo el código está ubicado en este repositorio. Slf4j configurado y funcionando también. Tenga en cuenta que debe configurarlo programáticamente. No puede usar archivos .properties o .xml, el analizador no funciona en Android. Disfrutar.

https://sourceforge.net/projects/log4j-android/

+0

Chainsaw and Socket Appender parece ser increíble :) ¡Muchas gracias! –

2

El analizador de archivos de configuración de log4j no es cosa de compatibilidad androide safe.slf4j androide con log4j simplemente anula las clases de log4j que va a utilizar y los obliga a utilizar Android tala estilo Logcat. Aún no obtienes la flexibilidad total de log4j en Android. Porticé log4j en android en mi proyecto https://sourceforge.net/projects/log4j-android/, todo lo que tienes que hacer es agregar los dos jar en el directorio de binarios a classpath. Luego

static { 
    org.apache.log4j.Logger root = org.apache.log4j.Logger.getRootLogger(); 

    final SocketAppender appender = new SocketAppender("192.168.1.4", 4445); 


    root.addAppender(appender); 
} 

private static final org.slf4j.Logger logger = LoggerFactory.getLogger(MyClass.class); 

static { 
    logger.info("Hello logger"); 
} 

Esto comenzará a enviar mensajes al host remoto que usted especificó. A continuación, puede ver estos mensajes con Chainsaw http://logging.apache.org/log4j/docs/webstart/chainsaw/chainsawWebStart.jnlp. Para hacer que la motosierra funcione, haga clic en la segunda casilla de verificación en el cuadro de diálogo que aparece, haga clic en Aceptar, inicie su aplicación y aparecerá una nueva pestaña. Tenga en cuenta que su cortafuegos podría bloquearlo ...

+0

Simplemente curioso. ¿Cuál es la "compatibilidad con Android"? Parece bastante fácil rodar su propio lector de propiedades en menos de 200 LOC. –

+1

Me refería a la compatibilidad de Android slf4j. En realidad, no agregan soporte para log4j, solo omiten las clases log4j con las suyas dentro de un contenedor. Luego envían todos los registros que irían a log4j a logcat. Esto fue horrible para mí porque odio Logcat es un sistema de registro sin valor. El proyecto log4j-android es solo una versión de Android con las clases de analizador eliminadas esencialmente. Entonces slf4j tendiendo un puente hacia el log4j despojado. –

3

Hay un nuevo proyecto que habilita log4j en android. También es posible usar log4j sobre slf4j. También proporciona un appender para LogCat. Ver Logging in Android using Log4J.

El siguiente ejemplo muestra cómo configurar y usar log4j en Android.

Configurar el sistema log4j en Android

import org.apache.log4j.Level; 
import android.os.Environment; 
import de.mindpipe.android.logging.log4j.LogConfigurator; 
/** 
* Simply place a class like this in your Android applications classpath. 
*/ 
public class ConfigureLog4J { 
    static { 
     final LogConfigurator logConfigurator = new LogConfigurator(); 

     logConfigurator.setFileName(Environment.getExternalStorageDirectory() + "myapp.log"); 
     logConfigurator.setRootLevel(Level.DEBUG); 
     // Set log level of a specific logger 
     logConfigurator.setLevel("org.apache", Level.ERROR); 
     logConfigurator.configure(); 
    } 
} 

Inicio de sesión en Android usando log4j usando API slf4j

import org.slf4j.Logger; 
import org.slf4j.LoggerFactory; 

public class ExampleLog4JOverSLF4J { 
    private final Logger log = LoggerFactory.getLogger(ExampleLog4JOverSLF4J.class); 

    public void myMethod() { 
     log.info("This message should be seen in log file and logcat"); 
    } 
} 

Inicio de sesión en Android usando API log4j

import org.apache.log4j.Logger; 

public class ExampleLog4J { 
    private final Logger log = Logger.getLogger(LogConfiguratorTest.class); 

    public void myMethod() { 
     log.info("This message should be seen in log file and logcat"); 
    } 
} 
+2

Acabas de copiar esto del sitio ... ¿qué es esta clase? LogConfiguratorTest.class y ¿qué quiere decir al colocar ConfigureLog4J en el classpath de la aplicación, algo en algún lugar de mi código no tiene referencia? Por favor, muestre un ejemplo completo, no el basura que está en el sitio. – JPM

+0

¿Cómo se configuran los appenders personalizados con esto? –

+0

@JPM Probablemente quiso decir ExampleLog4J.class en lugar de LogConfiguratorTest.class –

2

Salida este proyecto para una implementación completa: http://code.google.com/p/log4j-android/

+1

Aunque es una buena respuesta, usted es la tercera persona que responde con el mismo proyecto. –