Komisches Logverhalten

MS-Tech

Erfahrenes Mitglied
Hallo Zusammen,

ich habe eine kleine Javaanwendung, die ich mit einer Batchdatei starte (java -jar ....). In meiner Javaanwendung habe ich einen Logger definiert, der auch schön brav seine Loggingausgaben macht.

Nun bin ich dabei eine Swing-Gui zu bauen und diese Anwendung eben über Runtime.getRuntime... zu starten. Komischerweise funktioniert hier der Logger nicht, d.h. es wird nichts geloggt.

Hat jemand eine Idee an was das liegen könnte?

Viele Grüße
MS-Tech
 
Hi,

danke erstmal für deine Antwort.

Ich habe 5 kleine Anwendungen entwickelt, die ich alle über eine start.bat starten kann, z.B. java -jar application.jar ..... Soweit so gut und diese Anwendungen funktionieren auch alle einwandfrei. Jetzt baue ich gerade eine Swing-Anwendung und möchte diese 5 Anwendungen über die Swing-Anwendung starten, aber nicht einfach nur die start.bat aufrufen. Ich möchte über die Swing-Anwendung die Startparameter verändern können und deshalb habe ich mir eben verschiedene Eingabemasken gebaut, in denen ich einzelne Parameter einstellen kann. Über einen Button möchte ich dann die einzelnen Anwendungen starten.

Momentan starte ich die Anwendung mit

Code:
Runtime.getRuntime().exec("cmd /c start java-jar " + command).

In dem Fall ist "command" die einzelnen weiteren Parameter. Die einzelnen Anwendung starten auch einwandfrei und laufen bis zum Schluss durch.

Ich hab nur ein Problem mit meinem Logger, den ich in den einzelnen Anwendungen definiert habe. Es wird einfach nix mehr geloggt, wenn ich die einzelnen Anwendungen über die Swing-Anwendung aufrufe.

Ich verwenden in den einzelnen Anwendungen immer ein und denselben Logger, also..

Code:
private static final Logger LOG = Logger.getLogger("xyz");

Die Logausgaben funktioneren auch, wenn ich die Anwendungen über die start.bat starte. Da funktioniert alles so, wie ich will.

Ich hoff ich hab dich nicht verwirrt? :)

Viele Grüße
 
Also zuerst würde ich das Runtime.exec auf den ProcessBuider ändern.
siehe http://stackoverflow.com/a/6856659

Runtime.exec macht im Prinzip nur Probleme, gerade wenn man mit Parametern arbeitet.

Dann kommt es auf deine Logging-Properties an.
Werden diese korrekt geladen?
Woher kennen deine Programme die Logging-Configuration?

[EDIT]
Wenn du nicht in eine Datei loggst, sondern nur in die Konsole, wird der Output nicht so einfach dargestellt.
Zumindest wenn du Runtime.exec (oder halt den ProcessBuilder) benutzt.

Um die Ausgabe zu sehen, schaue dazu:
http://stackoverflow.com/a/4741987

(habe den Code etwas angepasst, so das in den regulären StdOut geschrieben wird)
Java:
public static void main(String[] args) throws Exception {
     try {
       String line;
       Process p = Runtime.getRuntime().exec( "echo HelloWorld2" );

       BufferedReader in = new BufferedReader(
               new InputStreamReader(p.getInputStream()) );
       while ((line = in.readLine()) != null) {
         System.out.println(line);
       }
       in.close();
     }
     catch (Exception e) {
       // ...
     }
}
 
Zuletzt bearbeitet:
Hi,

ich würde das ganze Logging sowiso in eine Datei schreiben, das macht das ganze viel einfacher. Ich bevorzuge zum Beispiel slf4j mit logback, sehr einfach zu verwenden und fein konfigurierbar, was wie geloggt werden soll.

Grüße,
BK
 
Hallo Zusammen,

also ich log in die Konsole und auch in die Datei. Die Konsolenausgaben sehe ich ja im Eingabefenster, welches sich öffnet.

Es wird nur nicht in die Datei geloggt.

Jedes meiner kleinen Programme hat eine eigene Log-Konfiguration, auch wenn diese immer gleich ist. Es handelt sich aber um einzelne und eigenständige Anwendungen.

Hier meine Log-Konfiguration:

Code:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd" >
<log4j:configuration>

	<appender name="infoFile" class="org.apache.log4j.FileAppender">
		<param name="maxFileSize" value="10000KB" />   
		<param name="file" value="logs/application.log" />
		<param name="Append" value="false" />
		<layout class="org.apache.log4j.PatternLayout">
			<param name="ConversionPattern" value="%d{dd.MM.yyyy HH:mm:ss,SSS} %-5p %c{1}:%L - %m%n" />
		</layout>
	</appender>
  
	<appender name="stdout" class="org.apache.log4j.ConsoleAppender">
		<param name="Target" value="System.out" />
		<layout class="org.apache.log4j.PatternLayout">
			<param name="ConversionPattern" value="%d{dd.MM.yyyy HH:mm:ss,SSS} %-5p %c{1}:%L - %m%n" />
		</layout>
	</appender>

	<root>
	  <priority value="info" />
	  <appender-ref ref="infoFile" />
	  <appender-ref ref="stdout" />
	</root>
</log4j:configuration>

Ich habe auch schon versucht anstatt Runtime.getRuntime().exec.... den ProcessBuilder zu verwenden, aber irgendwie bekomme ich dann meine Anwendung nicht zum laufen. Ich denke aber auch nicht, dass eine Umstellung dann mein Problem mit dem Logging behebt oder?

Viele Grüße
 
Könnte mir vorstellen das entweder die Log4J configuration nicht geladen wurde (weil nicht gefunden -> siehe Warnings) ,
oder das das Verzeichnis *logs* (durch Process.Run) an einer anderen Stelle liegt als von dir vermutet!
Versuche mal absolute Pfadangaben zum Test!.

(und schaue mal im Java-Verzechnis oder System32 nach deinem Logs Ordner...)

so in etwa funktioniert der ProcessBuilder:

Java:
       List<String> parms = new ArrayList<String>();
       parms.add("java"); 
       parms.add("-Xms64M");
       parms.add("-Xmx400M");
       parms.add("-cp"); 
       parms.add("jar1;jar2;jar3"); 
       parms.add("path.to.your.MainClass"); 
       parms.add("mainClassParm1"); 
       parms.add("mainClassParm2"); 
       ProcessBuilder pb = new ProcessBuilder(parms);   
       Process proc = pb.start();
 
Zurück