2013-03-25 14 views
9

Ich habe Probleme mit einer Anwendung, die abstürzt, wenn ich sie auf anderen Computern mit JRE 1.7 bereitstelle. Wenn ich dies in NetBeans (oder sogar direkt aus der JAR-Datei) auf meinem PC starte, ist alles in Ordnung. Aber auf einem anderen Computer schlägt es bei bestimmten Ereignissen (Knopfklicks) während der Ausführung fehl.Log4j - Die Protokolldatei kann nicht gefunden werden

So lernte ich über das Logging mit der Bibliothek log4j. Dies gab mir einige Informationen über ein Problem in meiner Anwendung, und die Protokollierung funktioniert einwandfrei, wieder auf meinem Computer. Aber wenn ich die JAR-Datei auf anderen Computern, die nur JRE ausführen (Java 7 Update 17), bereitstellen, kann ich keine Spuren von Protokolldateien finden.

Hier ist meine log4j.properties Datei:

# 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 

Auf meinem Computer, ich kann die logging.log Datei direkt in den Projektordner sehen. Insofern funktioniert alles perfekt. Auf dem Benutzer-PC gibt es jedoch keinerlei Anzeichen für diese Datei. Nicht in C: \ (wo ich dachte, es wäre), nicht in C: \ Programme (x86) \ oder irgendwo anders. Ich habe meine Festplatte vollständig durchsucht, aber nichts kommt zurück.

Wo sollte diese Datei gespeichert werden? Sind meine Eigenschaften richtig eingestellt? Sehr verwirrt ...

Vielen Dank!

+3

Kann der Benutzer auf dem Zielcomputer Dateien im Stammverzeichnis auf dem Laufwerk c erstellen? – DwB

+2

Um zu beginnen, müssen Backslashes in den Eigenschaftendateien verdoppelt werden: 'C: \\ logging.log'. Oder benutze Schrägstriche, da Windows sie akzeptiert: 'C:/logging.log' – Kenster

+0

DwB - ja, sie haben volle Zugriffsrechte auf c: \. Ich glaube nicht, dass dies ein Berechtigungsproblem ist. – Alex

Antwort

6

Für den Fall, dass jemand auf diesen Beitrag stolpert, wollte ich dokumentieren, wie ich es gelöst habe.

Zunächst, wie DwB richtig darauf hingewiesen hat, war das Problem in der Tat, dass das Konto des Benutzers nicht ausreichende Berechtigungen zum Erstellen der Datei logging.log hatte. In meinem Code hatte ich einen catch-Block, der ausgeführt wurde und enthielt Code, um das System im Falle eines Dateischreibfehlers zu beenden. Da es genau das Logging-Detail war, was ich zu schreiben versuchte, konnte ich keine Ausgabe erhalten, um mich als Quelle meines Problems zu identifizieren.

Sobald ich das erkannte, musste ich nur ändern, wo ich die Protokolldatei schrieb. Anstatt es in den Stammordner (C: \) oder in den Ordner zu schreiben, in dem sich die JAR-Datei befand (C: \ Programme \), die ich nicht garantieren konnte, dass ein Benutzer über die vollen Berechtigungen verfügte, entschied ich mich um einen Ordner in ihrem AppData-Pfad zu erstellen.

Die erste Zeile in meinem Programm ist nun ein Aufruf dieser Funktion (die Gattungsbezeichnung MyProgram verwenden):

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

Dies erstellt einen Ordner MyProgram in dem Konto des Benutzers bei \ AppData \ Roaming bezeichnet. Da dieser Pfad Teil des Pfads des Benutzerkontos ist, glaube ich, dass der Benutzer immer in der Lage sein wird, an ihn zu schreiben, wodurch das Problem der Berechtigungen gelöst wird. Wenn jemand etwas anderes weiß, lass es mich wissen.

Dann in meiner log4j.properties Datei, ändere ich die Zeile

log4j.appender.file.File=logging.log 

zu

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

Dadurch wird die Datei in den Ordner verweist, die ich gerade erstellt haben.

Sobald ich das getan habe, und einige gut platzierte Logging-Nachrichten hinzugefügt, konnte ich meine anderen Probleme finden, und jetzt funktioniert alles gut.

Ich hoffe, dass dies jemand aus hilft. Wenn jemand irgendwelche Vorschläge hat, bitte posten.

Verwandte Themen