2010-05-26 14 views
13

Sto tentando di calzare un SDK esistente su un dispositivo Android e una delle dipendenze di detto SDK è Apache log4j. Sono in grado di caricare il mio programma di test sull'emulatore Android, ma quando viene chiamato l'oggetto log4j "PropertySetter" il programma fallisce con un'eccezione di verifica. C'è un modo per migliorare questo problema?supporto log4j in Android

+0

Checkout questa semplice libreria wrapper per l'accesso a Android [https://github.com/oronno/log4android](https://github.com/oronno/log4android) –

+0

Dai un'occhiata a questo progetto http://nikedlab.com/android-log-rolling-library.html – NikedLab

risposta

3

Si consiglia di provare a scambiare in slf4j al posto di log4j. Non è un interruttore indolore, ma è probabile che sia più facile di quello che hai. slf4j fornisce un front-end comune per diversi logger incluso log4j e c'è un pacchetto slf4j-android.

No, il meccanismo di registrazione di Android non è corretto. È molto inadeguato rispetto a ciò che log4j può fare per te.

13

In realtà l'uso di slf4j è stato per me un processo notevolmente indolore, e mi sembra il caso comune, almeno per le librerie che utilizzano funzionalità log4j dirette. Non avete davvero bisogno di scambiare slf4j dentro per log4j, aggiungere solo due biblioteche SLF4J al progetto da http://www.slf4j.org/download.html:

- biblioteca slf4j per Android (attualmente SLF4J-android-1.6.1-RC1.jar)
- il ponte log4j su slf4j (http://www.slf4j.org/legacy.html#log4j-over-slf4j).

Quest'ultimo definisce le classi core log4j utilizzate dalle implementazioni tipiche e li associa all'implementazione di slf4j Android. Una volta aggiunte le librerie, il codice funziona.

+0

Grazie wors per me ... (testato) – Hurda

+0

Puoi spiegare un po 'più in dettaglio come hai integrato slf4j nel tuo android progetto? Sto cercando di usare slf4j in un progetto Android e sto avendo difficoltà a configurarlo tramite un file log4j.properties o log4j.xml. Non sono nemmeno sicuro che dovrei provare a configurare slf4j-per-android con un file log4j.properties. Slf4j-per-android è fondamentalmente un wrapper per la normale registrazione di Android (e, di conseguenza, dovrei usare la configurazione di registrazione di Android invece di log4j) – seanoshea

+0

Non esiste alcun file di configurazione per slf4j-android, È possibile configurare il livello di registrazione all'avvio l'emulatore e quando si sfogliano i registri tramite logcat – kokosing

5

Ho ottenuto con successo log4j su Android con Socket Appender e Log4j Chainsaw. Tutto il codice si trova in questo repository. Anche Slf4j è configurato e funziona. Essere consapevoli di doverlo configurare a livello di programmazione. Non è possibile utilizzare .properties o .xml file il parser non funzionerà su Android. Godere.

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

+0

Chainsaw and Socket Appender sembra incredibile :) Grazie mille! –

2

Il parser per i file di configurazione log4j non è cosa compatibilità Android di safe.slf4j Android con log4j solo sovrascrive le classi log4j si intende utilizzare e li costringe a utilizzare Android registrazione stile logcat. Non hai ancora la piena flessibilità di log4j su Android. Ho portato log4j su Android nel mio progetto https://sourceforge.net/projects/log4j-android/ tutto quello che devi fare è aggiungere i due jar nella directory dei binari al tuo classpath. Quindi

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

Inizierà a inviare messaggi all'host remoto specificato. È quindi possibile visualizzare questi messaggi con Chainsaw http://logging.apache.org/log4j/docs/webstart/chainsaw/chainsawWebStart.jnlp. Per far funzionare la motosega fai clic sulla seconda casella di controllo nella finestra di dialogo che appare ok, avvia la tua app e dovrebbe apparire una nuova scheda. Ricordati che il tuo firewall potrebbe bloccarlo ...

+0

Solo curioso. Qual è la "cosa di compatibilità Android"? Sembra abbastanza facile girare il proprio lettore di proprietà in meno di 200 LOC. –

+1

Mi riferivo alla compatibilità Android di slf4j. In realtà non aggiungono il supporto per log4j, ma ignorano le classi log4j con le proprie all'interno di un jar. Quindi producono tutti i log che andranno a log4j su logcat. Questo è stato orribile per me perché odio logcat è un inutile sistema di log. Il progetto log4j-android è solo una versione di Android con le classi parser rimosse essenzialmente. Quindi slf4j si collega al log4j ridotto. –

3

C'è un nuovo progetto, che abilita log4j su Android. È anche possibile utilizzare log4j su slf4j. Fornisce anche un appender per LogCat. Vedi Logging in Android using Log4J.

L'esempio seguente mostra come configurare e utilizzare log4j in Android.

Configurare il sistema log4j in 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(); 
    } 
} 

Logging in Android utilizzando log4j usando slf4j API

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

Logging in Android utilizzando log4j API

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

Hai appena copiato questo dal sito ... qual è questa classe? LogConfiguratorTest.class e cosa intendi posizionando ConfigureLog4J nel classpath dell'applicazione, qualcosa da qualche parte nel mio codice non ha fatto riferimento a questo? Si prega di mostrare un esempio completo non quello immondizia che si trova sul sito. – JPM

+0

Come configurare Appenders personalizzati con questo ?? –

+0

@ JPM Probabilmente intendeva ExampleLog4J.class invece di LogConfiguratorTest.class –

2

Partenza questo progetto per una completa implementazione: http://code.google.com/p/log4j-android/

+1

Anche se è una buona risposta, sei la terza persona a rispondere con lo stesso progetto. –