log4j & taskname

hirsra

Aktives Mitglied
Hallo,

ich versuche mit log4j den taskname auszugeben. Das funktioniert im Prinzip auch, wenn ich allerdings den Taskname bei Konstruktor des Tasks, oder mit der Methode setName(), selber bestimme gibt log4j trotzdem den Defaultnamen des Tasks aus.

Hier mein Testprogramm zu Ausgabe:
Java:
package rh.Test;

import java.awt.EventQueue;

import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;

public class LogTaskname {
    private static final Logger LOGGER = Logger.getLogger(LogTaskname.class);

    static {
        PropertyConfigurator.configureAndWatch(System.getProperty("user.dir")
                                                   + System.getProperty("file.separator")
                                                   + "log4j.properties",
                                               1 * 1000);
    }

    public static void main(String[] args) {
        
        EventQueue.invokeLater(new Thread("AWT-Event") {
            @Override
            public void run() {
                
                LOGGER.info(getName());
                setName("AWT");
                LOGGER.info(getName());
            }
        });
    }

}
Wie man sieht gebe ich zuerst bei Konstruktor des Threads einen Namen an. Anschließend gebe ich den Tasknamen aus.

Das ist mein Propertiesfile:
Java:
log4j.rootLogger=WARN, CONSOLE
#log4j.rootLogger=WARN, CONSOLE, FILE

log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern = %d{HH:mm:ss,SSS z} %t %c{1} %p %m %n

log4j.appender.FILE=org.apache.log4j.FileAppender
log4j.appender.FILE.file=log.txt
log4j.appender.FILE.append=false
log4j.appender.FILE.threshold=info
log4j.appender.FILE.layout=org.apache.log4j.PatternLayout 
log4j.appender.FILE.layout.ConversionPattern = %d{dd.MM.yyyy HH:mm:ss,SSS z} %t %c %p %l %m %n

log4j.logger.rh=TRACE

log4j.debug=true
log4j.debug=false

und hier die Ausgabe auf der Konsole:
18:23:20,062 CET AWT-EventQueue-0 LogTaskname INFO AWT-Event
18:23:20,078 CET AWT-EventQueue-0 LogTaskname INFO AWT

Ich hätte erwartet, und gewünscht, dass nach der Ausgabe der Zeit mein Taskname erscheint, also erst "AWT-Event" und bei der zweiten Ausgabe "AWT".

Kann mir jemand weiterhelfen warum das nicht funktioniert?

Schönen Dank
Rainer
 
Interessant ist, dass wenn in Zeile 23 der Name des Threads gesetzt wird, dieser im Logging auch korrekt ausgegeben wird. Stattdessen wird der Name der AWT-Event-Queue ausgegeben obwohl im Konstruktor ein Threadname angegeben wird.

Ist da ein Bug in Java welches eigentlich den Threadname übernehmen müsste, oder habe ich da etwas falsch verstanden?
 
Da das ganze kein logging Problem ist habe ich das Thema als erledigt betrachtet. Ich suche das Forum mal durch ob ich sonst was zu diesem Thema finden. Bei Bedarf mache ich ein neues Thema auf.
 
Das Problem ist der Start des Threads in Zeile 20ff mittels run(). Dadurch wird zum einen der Thread nicht nebenläufig gestartet und hat irgendwie zur Folge dass log4j bei der Ausgabe des Threadnames Probleme hat.

Wir die Zeile 20 folgendermaßen ersetzt funktioniert es:
Java:
//        EventQueue.invokeLater(new Thread("AWT-Event") {
        (new Thread("test")  {
            @Override
            public void run() {

                LOGGER.info(getName());
                setName("AWT");
                LOGGER.info(getName());
                Thread.currentThread().setName("AWT");
                LOGGER.info(getName());
            }
        }).start();
 

Zurück
Oben