Mehrere Programme mit log4j loggen möglich?

jimb0p

Erfahrenes Mitglied
Hallo Zusammen,

für mein aktuelles Programm (ein Hauptprogramm, dass mehrere Unterprogramme aufruft) möchte ich jetzt gerne ein Logging einbinden. Für einen Programmablauf (der sowohl aus Hauptprogramm als auch aus beliebig vielen Aufrufen von Unterprogrammen bestehen kann) möchte ich ein Logging in ein und die selbe Datei haben. Ist das generell realisierbar mit log4j? Ich finde immer nur einfache Beispiele, nicht aber wenn es über mehrere Programme geht.

Gruß jimb0p
 
Hi,

wie rufst du die Unterprogramme auf? Per "java -jar" (also richtig extern) oder durch einbinden der jars in den Classpath und direktem Aufruf der main() Methode?

Bei zweiterem ist das imho sehr einfach zu realisieren.

Grüße,
BK
 
Rufe Sie per "java -jar" auf. Ich rufe Sie so auf damit ich auf das Abarbeiten der Programme warte. So sieht das aus:

Code:
Runtime.getRuntime().exec(appQueue.get(i)).waitFor();

In der ArrayList<String> appQueue stehen dann die Befehle drin.

Wäre es anders besser?
 
Zuletzt bearbeitet:
Hi,

naja, wenn du die main() Methode des anderen Programms direkt aufrufst, startest du nicht extra einen Prozess, die beiden Programme laufen in der selben VM. Somit brauchst du auch kein waitFor(), ein einfacher Aufruf der main() Methode reicht.

Somit wird auch das Logging an die andere Main-Methode verarbt, ergo laufen alle Ausgaben in die selbe Logdatei.

Grüße,
BK
 
Ok ich teste es gerade. Das Einbinden funktioniert soweit. Mit meinem Programm kann man halt die Ablaufreihenfolge der Unterprogramme (ca. 8) in einer Schlange planen (Modul2, Modul4, Modul7, Modul3 ... usw.). Es können beliebig viele Module geplant werden. Bis jetzt habe ich halt dann immer den "java -jar" Befehl in die ArrayList<String> gepackt und anschließend einfach über die Liste iteriert und jeden Befehl ausgeführt und auf Abarbeitung gewartet. Wie würde ich es dann jetzt am besten machen? Wie merke ich mir wann welches Tool dran ist?
 
Zuletzt bearbeitet:
Hi,

in der Liste speicherst du Class<?> Objekte. Beim iterieren über die Liste holst du dir von diesen Klassen per Reflection die main() Methode und rufst diese auf.

Grüße,
BK

// Edit: Hier mal ein Beispiel-Code:
Application.java:
Java:
package de.tutorials.bratkartoffel;

import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;

public class Application {
	public static void main(String[] args) {
		Application app = new Application();

		try {
			app.doWork();
		} catch (SecurityException | ReflectiveOperationException e) {
			e.printStackTrace();
		}
	}

	public void doWork() throws ReflectiveOperationException, SecurityException {
		List<Class<?>> queue = new ArrayList<>();

		queue.add(Modul1.class);
		queue.add(Modul3.class);
		queue.add(Modul2.class);

		Object[] params = { new String[] { "hier", "die", "parameter", "der",
				"module" } };

		for (Class<?> clazz : queue) {
			Method main = findMain(clazz);

			main.invoke(null, params);
		}
	}

	private Method findMain(Class<?> clazz) throws NoSuchMethodException,
			SecurityException {
		return clazz.getDeclaredMethod("main", String[].class);
	}
}

Modul1.java bis Modul3.java:
Java:
package de.tutorials.bratkartoffel;

// hier je nach Modul den Klassennamen anpassen
public class Modul1 {
	public static void main(String[] args) {
		// hier je nach Modul die Ausgabe anpassen
		System.out.println(Modul1.class.getSimpleName() + " ist dran mit args=" + args);
	}
}

Ausgabe auf Konsole:
Code:
Modul1 ist dran mit args=[Ljava.lang.String;@1653033e
Modul3 ist dran mit args=[Ljava.lang.String;@1653033e
Modul2 ist dran mit args=[Ljava.lang.String;@1653033e
 
Zuletzt bearbeitet:
Super vielen Dank für die ausführliche Hilfe. Ich habe noch eine Verständnisfrage: Worin ist der Unterschied zwischen Reflection und die Klassen ins Hauptprogramm einbinden und dann mit den Objekten arbeiten?
 
Hi

Ohne Reflection müssen verwendete Klassen etc.
zu einem gewissen Grad beim Kompilieren schon bekannt sein.
Und sowas wie "alle Klassen durchgehen" geht auch nicht,
ohne von jeder extra den Namen hinzuschreiben (was wieder bedeutet,
dass sie beim Kompilieren schon da sein muss).

Mit Reflection wirds zwar komplizierter und langsamer,
aber dafür ist man von der ganzen Muss-vorher-bekannt-sein-Sache komplett gelöst.
Es reicht, wenn man direkt bei Verwendung Namen von Klasse und Variable/Methode hat,
nicht früher. Man könnte auch zB. den Benutzer eingeben lassen,
welche Methode aus welcher Klasse er jetzt aufrufen will; alles kein Problem.
 
Hallo, danke für die Hilfe. Ich habe jetzt das Problem, dass meine GUI nicht angezeigt wird bei den Modulen. Die laufen erfolgreich durch, jedoch sieht man nix von der aktiven GUI. Alle Elemente fehlen und sie ist eingefrohren.
 

Neue Beiträge

Zurück