# Log4J -> SWT



## DaRolla (14. Dez 2004)

kennt ihr log4j, DAS logging tool der apache group?

ich möchte nun die log ausgabe nicht nur auf stdout und in ner log datei haben, sondern in meine textarea appenden.

aber wie?

hab da noch nichts gefunden, arbeitskollegen wußtens auch nicht.

wer hilft mir?


----------



## foobar (16. Dez 2004)

Du mußt einen eigenen Appender implementieren, indem du von der Klasse AppenderSkeleton erbst. Nähere Informationen dazu findest du im Log4J Manual.


----------



## DaRolla (16. Dez 2004)

und dann in den log4j.properties den appender einbauen?


----------



## DaRolla (16. Dez 2004)

Also mal angenommen, ich erbe von der abstrakten Superklasse AppenderSkeleton.

Wie implementiere ich den Appender?

Bisher mache ich das ganze so:


```
public class EarthdawnArena {

    // Log4J
    private static Logger log = Logger.getLogger( EarthdawnArena.class );

    // Konstanten
    private static final String PROPS_DIR   = "props/"; 
    private static final String LOG4J_PROPS = PROPS_DIR + "log4j.properties";           
        
    public static void main( String[] args ) {
        
        // Log4J
        PropertyConfigurator.configure( LOG4J_PROPS );
        
        log.info( "Die Earthdawn Arena wird gestartet." );
        
        EarthdawnGui.showGui();     
    }
}
```


Die Properties sehen so aus:


```
log4j.rootLogger=info, stdout, R´

log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout

log4j.appender.stdout.layout.ConversionPattern=[%5p] [%-23F] - %m%n

log4j.appender.R=org.apache.log4j.RollingFileAppender
log4j.appender.R.File=Earthdawn.log

log4j.appender.R.MaxFileSize=5000KB
log4j.appender.R.MaxBackupIndex=1

log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=%d{dd.MM.yyyy HH:mm:ss} %-5p %-30F - %m%n
```


Das ist also der normale Mechanismus, wies im Short Manual steht.

Das richtige Manual ist commercial, also wenn Du noch n Tipp hast wäre ich Dir sehr dankbar.

Gruß
DaRolla


----------



## DaRolla (16. Dez 2004)

Sorry wenn dieses Thema nun mehr auf Log4J als auf AWT, Swing & SWT eingeht...


----------



## Jaraz (16. Dez 2004)

Hi,

mal schmutzig zusammen gehackt:


```
import javax.swing.*;

import org.apache.log4j.*;

public class Main extends JFrame {
	static public void main(String[] args) throws Exception {
		
		Main main = new Main();
		JTextArea area = new JTextArea();
		
		main.getContentPane().add(area);
		main.setSize(400,400);
		main.setVisible(true);
		
		MyAppender a = new MyAppender(area);
		
		Logger root = Logger.getRootLogger();
		root.addAppender(a);
		root.debug("Some message.");
		root.info("Another message.");
	}
}


import javax.swing.*;

import org.apache.log4j.*;
import org.apache.log4j.spi.*;

public class MyAppender extends AppenderSkeleton {

	private JTextArea area;

	public MyAppender(JTextArea a) {
		this.area = a;
	}

	protected void append(LoggingEvent e) {
		area.setText(area.getText()+"\n"+e.getMessage());
	}

	public void close() {
		
	}

	public boolean requiresLayout() {
		return false;
	}
}
```

Gruß Jaraz


----------



## DaRolla (16. Dez 2004)

Ich versteh wie du das meinst.
Vielen dank !!!

Probiers später mal aus...


----------



## DaRolla (17. Dez 2004)

habe aus dem commercial Manual mal den CountingConsoleAppender ausprobiert.

der genaue Aufruf ist dieser:



```
public static void main( String[] args ) {      
        
        // Log4J mit eigenem Appender starten
        PatternLayout pl = new PatternLayout();
        pl.setConversionPattern( "%5p - %m%n" );        
        
        // Appender instantiieren, benennen und layouten
        CountingConsoleAppender cca = new CountingConsoleAppender();
        cca.setLimit( 2 );
        cca.setName( "cca" );
        cca.setLayout( pl );
        
        // Appender hinzufuegen
        Logger rl = Logger.getRootLogger(); 
        rl.addAppender( cca ); 
        rl.debug("Erst eins."); 
        rl.info("dann zwei.");      
        rl.warn("dann drei.");
    }//main
```

Vielen Dank nochmal und liebe Grüße
DaRolla

PS: hier der Quelltext aus dem Manual:


```
import org.apache.log4j.AppenderSkeleton;
import org.apache.log4j.spi.ErrorCode;
import org.apache.log4j.spi.LoggingEvent;


/**
 * S.122 Log4J The Complete Manual.pdf 
 */
public class CountingConsoleAppender extends AppenderSkeleton {

    int counter = 0;
    int limit = 16;
        
    // Konstruktor
    public CountingConsoleAppender() {
    }
    
    /**
     * Getter
     */
    public void setLimit(int limit) {
        this.limit = limit;
    }
    
    /**
     * Setter
     */
    public int getLimit() {
        return limit; 
    }
    
    /**
     * MUSS !
     */
    public void append(LoggingEvent event) {
        if(this.layout == null) {
            errorHandler.error("No layout set for the appender named [" + name+"].", null, ErrorCode.MISSING_LAYOUT);
            return;
        }
        if(counter >= limit) {
            errorHandler.error("Counter limit reached in ["+ getName() +"] appender", null, ErrorCode.WRITE_FAILURE);
            return;
        }
        
        // output the events as formatted by our layout
        System.out.print(this.layout.format(event));
        
        // if our layout does not handle exceptions, we have to do it.
        if(layout.ignoresThrowable()) {
            String[] t = event.getThrowableStrRep();
            if (t != null) {
                int len = t.length;
                for(int i = 0; i < len; i++) {
                    System.out.println(t[i]);
                }
            }
        }
    
        // prepare for next event
        counter++;
    }

    /**
     * MUSS !
     */ 
    public void close() {
        if(this.closed) // closed is defined in AppenderSkeleton
            return;
        this.closed = true;
    }
    
    /**
     * MUSS !
     */
    public boolean requiresLayout() {
        return true;
    }    
}//class
```


----------

