Log4j Threading Problem

psycotis

Grünschnabel
Hi,

ich habe ein Problem mit log4j. Und zwar schreiben 2 Logger mit jeweils unterschiedlichen FileAppender dem anderen Logger in sein File.

Hier mal der Testcode dazu wo man das Problem sehr schön sehen kann:

PHP:
public class ThreadTestlog4j extends Thread
{
	private final long ID = CommonHelpers.getNextUniqueNumber(); // Unique Number

       // to get a unique Logger for every Class Intance
	private final Logger logger = Logger.getLogger(this.getClass() + "." + ID);
	private final String name;
	private final FileAppender appender = new FileAppender();

	public ThreadTestlog4j(String name) throws IOException
	{
		this.name = name;
		addApps();
	}

	public void run()
	{	
		for (int i = 0; i <= 20; i++)
		{
			try
			{
				sleep(1000);
			}
			catch (InterruptedException e)
			{
				// TODO Auto-generated catch block
				e.printStackTrace();
			}

			logger.error(name);
		}
	}

	private void addApps() throws IOException
	{
		appender.setFile("C:\\logs\\" + name + ".log");
		appender.setAppend(false);
                // set your own Layout
		appender.setLayout(Utils.PATTERN_LAYOUT);
		appender.setName(name);
		logger.setAdditivity(false);
		appender.activateOptions();
		logger.addAppender(appender);
	}

	public static void main(String... args) throws IOException
	{	
		ThreadTestlog4j a = new ThreadTestlog4j("aa");
		ThreadTestlog4j b = new ThreadTestlog4j("bb");

		a.start();
		b.start();
	}
}

Einfach mal die log files anschauen die dabei herauskommen dann erkennt man schnell das Problem.

Danke schon mal im Vorraus
 
habe zwar auch keine Ahnung warum, aber ich hatte so ein Phänomen mal als ich mit den Propertieskonfigurationsmöglichkeiten ein ähnliches Szenario hatte. Ich wechselte auf XML-Konfiguration und dann klappte es.
Außerdem ist das Thema auch für mich sehr interessant, und wie ich einzelne Themen abonieren kann ohne zu antworten, habe ich leider immer noch nicht hier im Forum herausgefunden.

halt mich auf dem Laufenden :-)
Takidoso
 
nach längerem hin und her habe ich erst einmal die java logging api ausprobiert. Es meister das Problem ist aber von den Möglichkeinten einfach zu simpel und erfordet zu viel eigene Implementierungen für meinen Geschmack.

deshalb habe ich es verworfen java logging zu verwenden. Dann habe ich noch
logback ausprobiert, den "Nachfolger" von log4j von dessen Erfinder Ceki Gülcü.

Irgendwie finde ich es nicht so intuitiv wie log4j, meister aber die Aufgabe ebenfalls.

Beim Debuggen habe ich herrausgefunden das logback im Gegensatz zu log4j u. a. locks bei iterieren der Appender setzt.
Das allein kann aber nicht der Grund sein da ich auch nachdem ich diese Locks in log4j implementiert hatte das selbe seltsame Ergebnis zustande kommt.

Soweit der Stand. Da ich langsam etwas in Zeitdruck komme werde ich wahrscheinlich auf logback umsteigen, aber falls sich noch neue Erkenntnisse ergeben werde ich es hier posten.

Falls jemand etwas herrausfindet wäre es nett es hier zu posten.

so long
 
Zurück