2013-03-25 18 views
9

Ho problemi con un'applicazione che si arresta in modo anomalo quando la distribuisco ad altri computer che eseguono JRE 1.7. Quando eseguo questo all'interno di NetBeans (o anche direttamente dal file JAR) sul mio PC, va tutto bene. Ma su un altro computer non riesce a eventi specifici (clic del pulsante) durante l'esecuzione.Log4j - Impossibile trovare il file di registro

Quindi, ho imparato a utilizzare la libreria log4j. Questo mi ha dato alcune informazioni su un problema nella mia applicazione, e il logging funziona perfettamente, sempre su MY computer. Tuttavia, quando distribuisco il file JAR su altri computer, che eseguono solo JRE (Java 7 Update 17), non riesco a trovare tracce di alcun file di registro.

Ecco il mio file log4j.properties:

# Root logger option 
log4j.rootLogger=INFO, file, stdout 

# Direct log messages to a log file log4j.appender.file=org.apache.log4j.RollingFileAppender 
log4j.appender.file.File=C:\logging.log 
log4j.appender.file.MaxFileSize=1MB 
log4j.appender.file.MaxBackupIndex=1 
log4j.appender.file.layout=org.apache.log4j.PatternLayout 
log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} 
%-5p %c{1}:%L - %m%n 

# Direct log messages to stdout log4j.appender.stdout=org.apache.log4j.ConsoleAppender 
log4j.appender.stdout.Target=System.out 
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout 
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} 
%-5p %c{1}:%L - %m%n 

Sul mio computer, posso vedere il file logging.log proprio all'interno della cartella di progetto. In tal senso, tutto funziona perfettamente. Tuttavia, sul PC dell'utente, non vi è alcun segno di questo file. Non in C: \ (dove pensavo che sarebbe), non in C: \ Programmi (x86) \ o altrove. Ho eseguito una ricerca completa del mio disco rigido, ma non viene restituito nulla.

Dove deve essere memorizzato questo file? Le mie proprietà sono impostate correttamente? Molto confuso ...

Grazie!

+3

L'utente sul computer di destinazione può creare file nella directory radice sull'unità c? – DwB

+2

Per iniziare, i backslash nei file delle proprietà devono essere raddoppiati: 'C: \\ logging.log'. O usare le barre in avanti, poiché Windows le accetterà: 'C:/logging.log' – Kenster

+0

DwB - sì, hanno i privilegi completi per c: \. Non credo che questo sia un problema di permessi. – Alex

risposta

6

Nel caso in cui qualcuno incappasse in questo post, volevo documentare come l'ho risolto.

Prima di tutto, come correttamente sottolineato da DwB, il problema era in effetti che l'account dell'utente non disponeva di privilegi sufficienti per creare il file logging.log. Nel mio codice, avevo un blocco catch che veniva eseguito e conteneva codice per uscire dal sistema in caso di errore di scrittura del file. Dato che era esattamente il dettaglio del logging era quello che stavo cercando di scrivere, non ero in grado di ottenere alcun risultato per identificarmi in questo come la fonte del mio problema.

Una volta capito questo, ho dovuto cambiare dove stavo scrivendo il file di registro. Piuttosto che scriverlo nella radice (C: \) o nella cartella in cui si trovava il file jar (C: \ Programmi \), entrambi i quali erano luoghi in cui non potevo garantire che un utente avrebbe i privilegi completi, ho deciso per creare una cartella nel percorso AppData.

La prima riga nel mio programma è ora una chiamata a questa funzione (utilizzando il nome MyProgram generica):

private static void makeAppDataFolder() { 
    File dir = new File(System.getenv("APPDATA") + "\\MyProgram"); 
    if (!dir.exists()) {dir.mkdir();} 
} 

Questo crea una cartella chiamata MyProgram nel account dell'utente in \ AppData \ Roaming. Poiché questo percorso fa parte del percorso dell'account utente, credo che l'utente sarà sempre in grado di scrivere su di esso, risolvendo in tal modo il problema dei permessi. Se qualcuno sa diversamente, per favore fatemelo sapere.

Poi, nel mio file log4j.properties, posso cambiare la linea

log4j.appender.file.File=logging.log 

a

log4j.appender.file.File=${user.home}/Application Data/MyProgram/logging.log 

Questo dirige il file nella cartella che ho appena creato.

Una volta eseguita questa operazione e aggiunto alcuni messaggi di registrazione ben posizionati, sono riuscito a trovare altri miei problemi e ora tutto funziona perfettamente.

Spero che questo aiuti qualcuno fuori. Se qualcuno ha qualche suggerimento, per favore posta.

Problemi correlati