Logger merkt sich seinen Level nicht

guni

Bekanntes Mitglied
Hallo,

ich habe einen PipedOutputStream der in einen PipedInputStream aus einem anderen Thread schreibt.
Um mir auszugeben, was zwischen meinen Threads so abgeht, habe ich mir den PipedStream wie folgt überschrieben:

Java:
public class MyPipedOutputStream extends PipedOutputStream {
	private static Logger LOGGER = Logger.getLogger(MyPipedOutputStream.class);

	private MyPipedOutputStream() {
		super();
	}

	public MyPipedOutputStream(Level loglevel) {
		this();
		LOGGER.setLevel(loglevel);
	}

	public void write(byte[] b, int off, int len) throws IOException {
		LOGGER.info(new String(b));
		super.write(b, off, len);
	}
}

Jetzt initialisiere ich eine Klasse, die Runnable initialisiert und uebergebe ihr den PipedStream.
Beim Erzeugen des Streams setze ich den Logging Level.

Sobald ich jedoch den Thread starte (der dann die write-Methode des Streams aufruft) ist mein Loglevel immer null. Obwohl ich in gesetzt habe- ???:L

Weiß irgendwer, woran das liegen könnte?!

mfg, guni
 
Java:
    public MyPipedOutputStream(Level loglevel) {
        this();
        LOGGER.setLevel(loglevel);
    }
Das ist aber nicht dein ernst, gell? 😱

Deine Klassen sollten nix am Logging konfigurieren, die Konfig sollte getrennt stattfinden.
 
ja. das hätte ich eigentlich vor gehabt.
der Punkt ist, dass ich aus EINER Klasse 3 verschiedene Threads erzeuge (mit unterschiedlichen Einstellungen), die ihren Output in den jeweils folgenden Thread pipen.
Jetzt will ich mir aber vielleicht nur eine Pipe mitloggen; die andere Pipe soll nicht geloggt werden!
in meiner log4j.properties kann ich das jedoch nicht unterscheiden, da es sich ja bei jedem der 3 Threads um die gleiche Klasse handelt!!!
 
logge direkt nach Zeile 10, was der LOGGER für ein Level gesetzt hat, vergleiche das mit dem Parameter,
wenn dort etwas anderes als null gesetzt wurde, wird sich das schon nicht von selber ändern,

lasse notfalls einen Thread mitlaufen, der alle 10ms wieder das Level abfragt und ausgibt,
wenn wirklich null da ist, dann normalerweise weil du das selber irgendwann gesetzt hast

falls du übrigens drei MyPipedOutputStream zeitgleich verwendest, dann haben die nicht jeweils eine eigenen LOGGER,
die statische Variable gilt für alle gleichzeitig, mit dem letzten gesetzten Wert,
nur zur Erinnerung, sollte eigentlich klar sein
 
Jetzt will ich mir aber vielleicht nur eine Pipe mitloggen; die andere Pipe soll nicht geloggt werden!
in meiner log4j.properties kann ich das jedoch nicht unterscheiden, da es sich ja bei jedem der 3 Threads um die gleiche Klasse handelt!!!
Zu dem was SlaterB schon geagt möchte ich nur hinzufügen, dass du bei log4j einstellen kannst, dass die Thread ID auch mitausgegeben werden kann, d.h. du kannst im log unterscheiden welcher Thread was gemacht hat, damit sparst du dir Verenkungen die die Sache umständlich & kompliziert machen.
 
ok.

Was ist, wenn ich mit Runtime.exec einen Fremdprozess starte.

Dann kann ich mir ja mit Process.getErrorStream / Process.getOutputStream einlesen, was der externe Prozess in der Konsole ausgegeben hat.

Hat log4j irgendwelche Möglichkeiten, auch das mit zu loggen?!

mfg, guni
 

Zurück
Oben