# Kann man Objekte in den ContentHandler übergeben?



## MiMa (28. Sep 2016)

Guten Morgen,
ich möchte gerne beim parsen von XML Dateien den j4Log benutzen um informationen in das Logfile schreiben zu lassen. Dabei übergebe ich das Logging Objekt in die entsprechenden Klassen um nur ein Logging Objekt zu benutzen.
Ich habe versucht das Logging Objekt dem ContentHandler mit zu geben, aber scheinbar funktioniert das nicht.

```
xmlReader.setContentHandler(new parserContentHandler(IndexLogger));
```
Die Fehlermeldung besagt das keine Paramter benötigt werden.
Demnach scheint diese Strategie nicht zu funktionieren.
Gibt es eine andere Möglichkeit dieses Logger Objekt dennoch in den ContentHandler zu benutzen?

Vielen Dank
M.


----------



## mrBrown (28. Sep 2016)

Den ContentHandler hast du selbst geschrieben? Dann den Konstruktor anpassen...


----------



## XyMorgan (28. Sep 2016)

Wenn parserContentHandler deine Klasse ist, dann pack den logger direkt da rein (Klassennamen besser mit GROSSBustaben beginnen ParserContentHandler), der logger sollte seine Klasse kennen, damit du gezielt loggen kannst, außerdem siehst sonst im log nicht wo die Ausgabe herkommt bzw. müsstest die Ausgabe unnötig mit Informationen anreichern um die Klasse zu erkennen.


----------



## MiMa (28. Sep 2016)

mrBrown hat gesagt.:


> Den ContentHandler hast du selbst geschrieben? Dann den Konstruktor anpassen...


Ja, habe ich aber der ContentHandler wird vom xmlReader aufgerufen und ich dachte, das ich das Logger-Objekt mitführen muss um darauf zu zu greifen.
Ich habe in der Klasse jetzt einfach eine neues Logger Objekt erstellt und es hat geklappt.
Mit dem log4j habe ich noch keine erfahrungen gemacht.
Wird in jeder Klasse die zu loggen ist ein neues Logger Objekt erstellt um diese loggen zu können?
Ich habe das Logger Objekt in den Methodenaufrufen immer übergeben, ansonsten würde ich das in meinen Klassen ändern.
Danke, Klassen schreibe ich auch am Anfang groß. Auf den Notebook sind die shift Tasten nicht besonders groß.

Vielen Dank


----------



## XyMorgan (28. Sep 2016)

Man könnte das so machen... mit einem logger-Objekt und so ...... hängt halt etwas davon ab womit du loggst, was selbstgebautes oder ne Standardkiste, bei logging denk ich halt immer direkt an log4j 

Wenn du selbst was baust und das berücksichtigst spricht natürlich absolut nix dagegen..... ausser sagen wir mal du hast 100 Klassen geschrieben in denen du loggen willst, da müsstest mit deiner Methode an 100 Klassen im Constructor dein Log-Object mitschleppen, nur um ggf. mal was zu loggen.... denke eher nicht sooo praktisch. Auch selbst gebaut würde ich da eher sowas wie ne statische registry implementieren. Und wenn man das schon macht.... kann man direkt ein logging-Framework nehmen, erspart viel arbeit.

Üblich ist, wie bei apache.commons.logging, statische LOGGER in jeder Klasse zu haben, früher gabs da oft 3rdParty Libs mit und ohne logging. Der Vorteil darin liegt in der späteren Konfiguration. Damit kannst gezielt festlegen, bis auf Klassenebene, welche Klassen welche Logausgaben mit welchem Level machen. Und die Ausgaben zusätzlich noch auf div. Dateien aufteilen, damit nicht alles zusammengewürfelt in einer Datei steht.

Das Prinzip ist dann ->

Klasse XYZ mit warn-level in die Datei 1.log
Klasse ABC mit warn-level in die Datei 2.log
Packete mit abc.xyz. mit debug-level auch in die Datei 1.log
.... usw.

Natürlich kann man unwichtige Klassen auch rauslassen und nicht direkt beim Anlegen neuer Klassen nen LOGGER reinpacken, oft zeigt sich nachher aber doch dass man den nutzt. Hängt aber natürlich stark davon ab wo der Code nachher läuft, ob console oder mit gui.


----------



## MiMa (28. Sep 2016)

Habe dann doch ein log4j Objekt in jede Klasse geschrieben. Das Mitschleppen wird auf Dauer ziemlich mühsam. 
Vielen Dank für die Hilfe


----------



## MiMa (29. Sep 2016)

Das mit dem Logger Objekt ist erledigt, da ich in jeder Klasse ein LoggerObjekt implementiert habe.

Es hat sich heraus gestellt, das ich im ContentHandler ein Objekt benötige, welches in den ContentHandler überführt werden muss da sich in diesem Objekt bereits Daten befinden und durch das parsen weitere hinzugefügt werden. Allerdings habe ich es nicht geschafft, da der xmlReader und beim Startvorgang zum Parsen kein Objekt übergeben werden kann.

Jetzt kann man auf den Gedanken kommen im Content Handler das benötigte Objekt zu erstellen und die Daten von oben nach unten zu füllen. Das erweitern des Konstruktors wäre kein Problem, aber das wiedererlangen der bereits vorhandenen Daten müssen erneut berechnet werden, was in meinen Augen ziemlich kontraproduktiv wäre.
Hat vielleicht jemand eine Idee ?

Danke
M.


----------



## MiMa (30. Sep 2016)

Problem gelöst.


----------

