# RCP und logging



## Gast2 (5. Jan 2010)

Hallo zusammen,

wenn bei einem RCP zum Beispiel in der doSave Methode ein Fehler passiert bekommt der User diesen angzeigt. Kann man diesen Fehler auch irgendwie loggen?

Gruß


----------



## Koringar (5. Jan 2010)

Hi,

grundsätzlich werden Fehler die du nicht abfängst spätestens nach ein paar Minuten von Eclipse her mit einer Exception behandelt, keine Ahnung wie diese jetzt genau hieß (hatte sie lange nicht mehr  ). Dies bekommt der User aber nicht mit.

Wenn du selber loggen willst kannst du das in etwa so:

```
ILog logView = Activator.getDefault().getLog();
String symbolicName = Activator.getDefault().getBundle().getSymbolicName();

logView.log(new Status(LevelAsInt, symbolicName, text, thrown));
```
Wenn der Level ein Error ist wird dem User das mitgeteilt das ein Fehler aufgetreten ist (zumindest bei mir ist das der Fall). Dies sieht aber nicht schön aus , deshalb würde ich wenn du den Fehler richtig behandeln willst die MessageBox oder einen eigene Dialog verwenden und den User fragen was er machen will.


----------



## Gast2 (5. Jan 2010)

Naja wenn ein Fehler in der doSave passiert kommt halt eine MessageBox mit Speichern fehlgeschlagen und der Grund, anders kann ich es auch nicht machen ...
Werden die logs in eine Datei geschrieben? Oder sieht man diese dann nur in der logview?


----------



## Koringar (5. Jan 2010)

Es passiert beides, da die LogView auch nur das File wiederspiegelt. Das File liegt im Workspace unter '.metadata'.


----------



## Gast2 (5. Jan 2010)

Ok dann loggst du die UI sachen so... ok gut zu wissen =)...
Wie kann man den Loglevel einstellen?


----------



## Koringar (5. Jan 2010)

Das kannste nicht direkt, der logt alles was du über 'logView.log' angibst. Du kannst aber über den Status den LogLevel auch definieren oder eher den Level der Meldung dabei ist 'LevelAsInt' (aus vorherigen Post) das Level.

Wenn du es so ähnlich wie log4j machen willst, musste das etwas umbasteln in dem du selber was schreibst das auf die LogView zugreift aber vorher prüft. Ich weis auch nicht ob es sowas schon gibt.


----------



## Gast2 (5. Jan 2010)

Koringar hat gesagt.:


> Das kannste nicht direkt, der logt alles was du über 'logView.log' angibst. Du kannst aber über den Status den LogLevel auch definieren oder eher den Level der Meldung dabei ist 'LevelAsInt' (aus vorherigen Post) das Level.
> 
> Wenn du es so ähnlich wie log4j machen willst, musste das etwas umbasteln in dem du selber was schreibst das auf die LogView zugreift aber vorher prüft. Ich weis auch nicht ob es sowas schon gibt.



Ah okay hab sowas gesucht wie bei log4j ...
Was loggst du den alles über die logView?? Nur Sachen in der GUI?
Wie ich sehe hat es in der logView keinen DEBUG level... Deshalb werde ich außerhalb der GUI lieber log4j einsetzen...


----------



## Koringar (7. Jan 2010)

Hi,

also ich logge alles über die LogView. Jedoch mache ich alles mit Log4J, da die Utils die ich für mein Projekt benötige intern selber auch mit Log4j loggen. Deshalb habe ich mir eine Klasse gebastelt die Log4J macht, aber dann als Ausgabe das Log von Eclipse verwendet.

Hier mal mein eigener Code, die funktioniert ganz gut:

```
package de.elena.zss.gui.utils;

import org.apache.log4j.AppenderSkeleton;
import org.apache.log4j.Level;
import org.apache.log4j.spi.ErrorCode;
import org.apache.log4j.spi.LoggingEvent;
import org.apache.log4j.spi.ThrowableInformation;
import org.eclipse.core.runtime.ILog;
import org.eclipse.core.runtime.Status;

import de.elena.zss.gui.Activator;
import de.elena.zss.gui.Application;

public class PluginLogAppender extends AppenderSkeleton {
	
	protected ILog logView;
	protected String symbolicName;
	protected String logLevel = "ERROR";
	
	@Override
	protected void append(LoggingEvent arg0) {
		if(logView == null){
			logView = Activator.getDefault().getLog();
			symbolicName = Activator.getDefault().getBundle().getSymbolicName();
		}
		
		if (this.layout == null) {
			this.errorHandler.error("Missing layout for appender " +
					this.name,null,ErrorCode.MISSING_LAYOUT); 
		    return;
		}
		
		StringBuffer text = new StringBuffer();
		if(Application.getUserFactory() != null){		
			if(Application.getUserFactory().getBenutzer() != null)
				text.append(Application.getUserFactory().getBenutzer().getUserId());
					
			text.append(":");
		}
		text.append(this.layout.format(arg0));

		Throwable thrown = null;
		if (this.layout.ignoresThrowable()) {
			ThrowableInformation info = arg0.getThrowableInformation();
		    if (info != null)
		    	thrown = info.getThrowable(); 
		}
				
		Level _level = arg0.getLevel();
		if(_level.toInt() >= Level.toLevel(logLevel).toInt()){		
			int severity = Status.OK;	
			if (_level.toInt() >= Level.ERROR_INT) 
				severity = Status.ERROR;
			else if (_level.toInt() >= Level.WARN_INT)
			    severity = Status.WARNING;
			else if (_level.toInt() >= Level.INFO_INT) 
			    severity = Status.INFO;
	
			logView.log(new Status(severity, symbolicName, text.toString(), thrown));	
		}
	}

	public void close() {
		logView = null;
		symbolicName = null;
	}

	public boolean requiresLayout() {
		return true;
	}

	public String getLogLevel() {
		return logLevel;
	}

	public void setLogLevel(String logLevel) {
		this.logLevel = logLevel;
	}
}
```

Dieser Appender ist auch so konzipiert das er unabhängig von anderen Appender sein eigenes Level hat.


----------

