# Log4J - Protokollierung auf die GUI zaubern!



## m!k3 (27. Jun 2005)

Hallo zusammen,

also entweder ich stell mich zu dumm an oder es gibt keine Möglichkeit das gesamte Protokoll auf eine GUI auszugeben. 
Ich find den Logger ganz schön handzuhaben möchte aber das Protokoll nicht in die Console oder auf File ausgeben sondern einfach in eine TextArea schreiben.

Gibts da doch ne Möglichkeit das zu realisieren?

Danke für eure Hilfe...  :wink:


----------



## KISS (27. Jun 2005)

dann must du wohl einen neuen appender basteln.


----------



## m!k3 (27. Jun 2005)

ohje.. kannst du mir da ein wenig helfen auf was ich da so achten muss? Zwecks Layout, Filter und was es da so gibt..


----------



## KISS (27. Jun 2005)

Layout und filter brauchst du erstmal nicht (da kann man die standards vom ConsoleAppender nehmen).

alles was du brauchst is ein appender an dem man eventListener andocken kann, dann brauchst du nur noch deine komponente auf die events reagieren lassen. dazu muestest du imho die doAppend methode ueberschreiben. schaue dir doch mal die sourcen eines implementierten appenders an


----------



## F4llen4ngel (27. Jun 2005)

wen du mal auf der log4j seite eines der beiden deutschen "tutorials" anklickst wirst du 2 programme entdecken die glaube ich das machen was du möchtest


----------



## m!k3 (27. Jun 2005)

danke für deinen Hinweis.. aber ich find irgendwie das Tutorial nicht.. bin grad auf der Log4J Seite
http://logging.apache.org/log4j/docs/index.html
Oder meinst du ne andere Site?!


----------



## F4llen4ngel (27. Jun 2005)

nicht direkt ;-)
http://logging.apache.org/log4j/docs/documentation.html
von da gehen ja einige links zu rutorials, artikeln etc. pp. an ...

wenn du dir da mal den "Logging für Java-Programme, Zu den Akten by Bernhard Bablok in Linux Magazine, 04/2002." anschaust ...
link dazu: http://www.linux-magazin.de/Artikel/ausgabe/2002/04/coffee/coffee.html


----------



## m!k3 (27. Jun 2005)

ja da war ich auch schon.. da wird zwar gezeigt dass es möglich ist, aber die Source entspricht nur normales Konsolen Logging..

also nicht wirklich eine Hilfe, wie das umzusetzen ist oder bin ich blind?!


----------



## F4llen4ngel (27. Jun 2005)

kann sein das ich mich missverständlich ausgedrückt habe - bzw. einfach an deiner frage vorbeigeschossen bin ;-)

du schreibst die sachen weiterhin in eine textdatei - steht auf der seite ja aucm im source, somit haste recht!
was ich nur meinte ist, dass es spiezielle Programme gibt die dir das lesen der log dateien leichter machen und das
2 von ihnen auf der seite per screenshot gezeigt werden ...


----------



## m!k3 (27. Jun 2005)

achso alles klar.. mhh irgendwo muss es doch n beispiel geben wie ichs direkt auf die gui bringe... mit dem Appender selber schreiben komm ich nicht wirklich klar..

:-(


----------



## Roar (27. Jun 2005)

leite einfach von SkeletonAppender ab und überschreibe die doAppend() methode. Dort fügst du einfach die für dich relevanten informationen die du aus dem übergebenen objekt entnehmen kannst in irgendeine textarea ein. deinen appende fügst du dem logger mit addAppender() hinzu.


----------



## m!k3 (27. Jun 2005)

Roar hat gesagt.:
			
		

> leite einfach von SkeletonAppender ab und überschreibe die doAppend() methode. Dort fügst du einfach die für dich relevanten informationen die du aus dem übergebenen objekt entnehmen kannst in irgendeine textarea ein. deinen appende fügst du dem logger mit addAppender() hinzu.



mh.. danke Roar..
ich glaub ich werds wohl ganz simpel lösen.. mir die Messages zusammenstellen und dann ausgeben ohne Log4J

weil habe halt das Problem, dass das JTextPane auf dem die Ausgabe erfolgen soll nicht in der Instanz ist, wo ich eigentlich protokolliere, sprich folgendes Schema:

Habe zwei Klassen:
FTP_GUI
FTP_Control

Auf der GUI werden Selektionen für die FTP Aktion gemacht, d.h. erst bei einer Bestätigung über einen Button wird über FTP_Control die Sitzung aufgebaut zu einem Server und Daten hin- und hergeschoben.

Soweit so gut - ich benutze für die FTP Sitzung das Package "edtftpj-1.5.1".
Dieses Package beinhaltet auch so eine eingeschränkte Log4J Version.

Außerdem gibt es einen FTPMessageCollector, der die Aktionen von FTP (Login, Upload, Download, wie man es halt von FTP kennt mitprotokolliert).

Im Demo von "edtftpj-1.5.1" werden dann die Logs mit dem "Log4J" Logger gemacht und auch die Messages von FTPMessageCollector ausgegeben.

Das ist so eigentlich wunderbar und wollte ich auch so handhaben - nur eben auf die GUI.

Nun hab ich halt ein JTextPane mit einem StyledDocument und das müsste halt zur Laufzeit von FTP_Control beschrieben werden.


hier mal kleine Coding-Auszüge:


```
public class FTP_Control {
    
    private Logger log = Logger.getLogger(FTP_Control.class);
    private FTPClient ftp;
    private FTPMessageCollector listener;
    
    /** Creates a new instance of FTP_Control */
    public FTP_Control(String host, String user, String password) {
        
        ftp = null;
        Logger.setLevel(Level.ALL);
        
        try {
            // set up client
            log.info("Connecting");

            ftp = new FTPClient(host);
            listener = new FTPMessageCollector();
            ftp.setMessageListener(listener);

             // login
            log.info("Logging in");
            ftp.login(user, password);

            // set up passive ASCII transfers
            log.debug("Setting up passive, ASCII transfers");
            ftp.setConnectMode(FTPConnectMode.PASV);
            ftp.setType(FTPTransferType.ASCII);

        } catch (Exception e) {
            e.printStackTrace();
        }
```


```
private void startAction(String action)
    {
        int rc = this.checkInput();
        
        if (rc == 0){
        
            String log;
            FTP_Control ftp_control = new FTP_Control(host, user, password);
            ftp_control.setRoot();
        
            if (action == upload){
                
                if (this.getSelectedMode() == write){
                    ftp_control.upload(file_src.getText(), file_trg.getText(),false);
                }
                else if (this.getSelectedMode() == append){
                    ftp_control.upload(file_src.getText(), file_trg.getText(),true);
                }
            }
            else if (action == download){
                ftp_control.download(file_src.getText(), file_trg.getText());
            }
        
            ftp_control.exitClient();
            log = ftp_control.getLog();
      
            this.writeLog(log,regular);  
        }
    }
    
    private void writeLog(String logtext, String style)
    {
        try 
        {
            StyledDocument doc = jtp.getStyledDocument();
            doc.insertString(doc.getLength(),logtext,doc.getStyle(style));
            doc.insertString(doc.getLength(),newline,doc.getStyle(italic));
        } catch (BadLocationException ble) 
        { System.err.println("Couldn't insert initial text into text pane."); }          
    }
```

In der Methode startAction wird die Klasse FTP_Control aufgerufen und die Aktionen ausgeführt, zum Schluss hol ich mir hier momentan das Log vom FTPMessageCollector und schreibs auf das TJextPane mit der Methode writeLog

Hoff ihr versteht was ich meine und wo nun mein Problem liegt, eigentlich möcht ich zur Laufzeit von FTP_Control Kommentare aufs JTextPane ausgeben mit dem Log4J

das Package edtftpj-1.5.1 gäbs hier: www.enterprisedt.com/products/edtftpj/choose.html


----------

