Logger-Fehlermeldung

Hallo,

habe einen eigenen Logger implementiert, den ich über RMI ansprechen will.

Eine Datei kann ich initialisieren. Auch einen Logger bekomme ich übergeben. Ich habe auch alles Serializiert, daher weiß ich jetzt nicht, was ich noch tun kann. Falls er sich daran stößt,daß das Logging in der statischen MainMethode stattfindet, habe ich bereits alle Inhalte der Main ausgelagert auf eine andere Klasse und rufe nur diese eine Methode auf. Aber immer noch die gleiche Fehlermeldung

In einer Woche ist Abgabetermin. Daher bin ich für jede Hilfe dankbar.

Jetzt der Code und die Konsolenausgabe:

Startklasse des Clients

LoggingInterface log = (LoggingInterface) Naming.lookup(url +„logging“);//Verbinden mit dem LoggingServer

log.init(LogFile);//LogBuch erstellt

System.out.println („LogBook initialisiert“);

System.out.println (module);

System.out.println(log);

//Übergabe des Modulnamens an den Logger

CoyoteLogger logger = log.getLoggerForModule(module); --> hier findet der Fehler statt!!!

System.out.println („Verbunden mit LoggingServer“);

logger.info(„Es wurde ein Logger erfolgreich initialisiert“, simTime, null);

Konsolenausgabe:

LogBook initialisiert

WorkflowServer

Proxy[LoggingInterface,RemoteObjectInvocationHandler[UnicastRef [liveRef: [endpoint:192.168.0.105:1446,objID:[3f085891:fe9fa64d3d:-8000, 0]]]]]

Exception in thread „main“ java.rmi.UnmarshalException: error unmarshalling return; nested exception is:

java.io.WriteAbortedException: writing aborted; java.io.NotSerializableException: java.util.logging.Logger

at sun.rmi.server.UnicastRef.invoke(Unknown Source)

at java.rmi.server.RemoteObjectInvocationHandler.invokeRemoteMethod(Unknown Source)

at java.rmi.server.RemoteObjectInvocationHandler.invoke(Unknown Source)

at $Proxy1.getLoggerForModule(Unknown Source)

at workflowServer.StartClass.main(StartClass.java:49) …

LoggingImpl:

/**

* Logger für Module erstellen, wenn kein Modul für Logger existiert wird ein neuer Logger erstellt

* @param name Name des Moduls

* @return CoyoteLogger

*/

public CoyoteLogger getLoggerForModule(String name){

System.out.println („in LoggingImpl - getLoggerForModule“);

CoyoteLogger reply = (CoyoteLogger) allLoggers.get(name);//Auslesen, ob Logger in Hashtabhle existiert

if (reply == null){//Wenn kein Logger für dieses Modul existiert, …

reply = createLogger(name);//… wird einer neu erstellt

System.out.println (reply + " getLoggerForModule");

}

return reply;//Rückgabe des Loggers

}//end getLoggerForModule

/**

* Logger für Modul neu erstellen

* @param name Modulname

* @return Neuer Logger

*/

public CoyoteLogger createLogger(String name){

CoyoteLogger newLogger = new CoyoteLogger(masterLogger);// Logger neu erstellen

newLogger.setModuleName(name);//Modulname zum Logger hinzufügen

allLoggers.put(name, newLogger);//Eintragen des Loggers in Hashtable

return newLogger;//Rückgabe des neuen Loggers

}//end createLogger

Konsolenausgabe für LoggingImpl:

Serverimplementierungen konstruieren

LoggingServer erfolgreich gestartet!

MasterLogger in LoggingImpl initialisiert

init in MasterLogger

zu JavaLogger hinzugefügt.

Level zu JavaLogger gesetzt

MasterLogger in LoggingImpl erstellt

in LoggingImpl - getLoggerForModule

logging.CoyoteLogger@181afa3 getLoggerForModule

Moin

In einer Woche ist Abgabetermin.

Du mit RMI stand ich mal genau vor dem gleichen Problem. Habs dann mit einem eigenen Protokoll zusammengehackt.

Den Teil der Fehlermeldung kann man getrozt vergessen, den erfindet RMI frei nach Schnautze.

Exception in thread „main“ java.rmi.UnmarshalException: error
unmarshalling return;

Jetzt der interessante Teil:

nested exception is:

java.io.WriteAbortedException: writing aborted;
java.io.NotSerializableException: java.util.logging.Logger

Du versucht eine Instanz der Klasse „java.util.logging.Logger“ per RMI zu verschicken, was natürlich in die Hose geht. (sun wird doch nicht seine eigenen Systeme unterstützen, nein, das wäre ja zu einfach).

at sun.rmi.server.UnicastRef.invoke(Unknown Source)

Und die JVM hat eine keine Ahnung wo genau.

Schreibt vor ALLE Referenzen auf irgendwelche Logger „transitent“ und bet dass der Logger nicht irgendwo intern referenziert wird.

at workflowServer.StartClass.main(StartClass.java:49) …

An der Stelle müsst was verschickt werden. An dem Object-Baum anfangen mit suchen.

cu