Logging mit dem DataImportHandler
Der DataImportHandler funktioniert, daran besteht kein Zweifel, sehr gut. Aber in manchen Situationen ist es wirklich schwierig mit ihm zu arbeiten.
Mir ist schon einige Male passiert: Ich indexiere einen großen Datenbestand und nach einer Stunde bricht die Indexierung auf Grund eines Fehlers ab. Die Fehlerbeschreibung, die man in den Log-Dateien findet, ist an sich aussagekräftig und weist auf das das technische Problem hin. Aber oft weiß man nicht, bei welchem Dokument oder Datensatz der Fehler aufgetreten ist. Die Meldung „Processing Document # 1“ bringt mich oft nicht weiter, also beginnt dann meistens die Suche nach der Nadel im Heuhaufen.
Aber es gibt für dieses Problem eine einfache Lösung. Diese Lösung heißt LogTransformer. Mit dem LogTransformer kann man auf der Ebene der Entity eine angepasste Ausgabe in die Log-Datei generieren. Man muss den LogTransformer nur konfigurieren und schon erhält man in den Log-Einträgen, beispielsweise, die ID des Dokuments, welches gerade verarbeitet wird.
DIH Konfiguration
Die Konfiguration des Transformers ist einfach. In seiner Entity muss man nur den LogTransformer registrieren und zusätzlich folgende zwei Eigenschaften pflegen:
- logTemplate – Hier kann man die zu loggende Meldung hinterlegen. Analog zu dem TemplateTransformer kann man hier freien Text definieren oder gar auf Werte der Entity selbst zugreifen.
- logLevel – mit diesem Property bestimmt man den Level, mit dem die Meldung generiert wird. Dies ist sehr nützlich, wenn man beispielsweise per Log4j getrennten Logs für unterschiedliche Log-Levels konfiguriert hat. Folgende Werte sind dabei möglich: „info“, „trace“, „warn“, „error“ und „debug“.
Beispielkonfiguration:
<entity name="dbBOOKS" query="select * from books"
transformer=" LogTransformer" logLevel="info"
logTemplate="Datensatz mit der ISBN ${dbBOOKS. ISBN} wird verarbeitet">
<field column="ISBN" name="ISBN" />
…
</entity>
Mit dem obigen Beispiel generiert man für jeden verarbeiteten Datensatz folgende Meldung im Log.
2526785 [Thread-24] INFO org.apache.solr.handler.dataimport.LogTransformer û Datensatz mit der ISBN 1234 wird verarbeitet
Bei komplexeren DIH-Konfigurationen, die mit nested Entities arbeiten, kann man für jede einzelne Entity andere Informationen ausgeben lassen, was eine Fehlersuche deutlich vereinfachen kann.
Fazit
Mit dem LogTransformer lassen sich wunderbar einfache Debug-Ausgaben in den Log-Dateien erzeugen. Der Aufwand ist gering und der Mehrwert, den man dadurch erhält, kann enorme Zeiteinsparung bedeuten. Dennoch gibt es, meiner Meinung nach, ein paar kleine Mankos in der derzeitigen Implementierung. Beispielsweise kann man je Entity nur eine Log-Ausgabe generieren. Ich habe mir in manchen Debug-Sessions schon gewünscht, dass dies anders wäre.
Weiterführende Links
Newsletter
Anmelden |