2013-06-17 14 views
5

Ich habe einige Beispieljobs, die Daten von einer Datenbank in eine andere migrieren, und ich möchte einige Informationen über den aktuellen Fortschritt haben, wie den, den Sie haben, wenn der Job interaktiv von der Anwendung selbst ausgeführt wird (ich exportiere und starte ihn) Befehlszeile). Ich benutze FlowMeter und StatsCatcher, aber alles, was ich habe, ist die Gesamtzeit und die Gesamtzahl der Datensätze (z. B. 4657 sec, 50.000.000 Zeilen). Gibt es eine Lösung, um ein anständiges Protokoll zu erhalten?Wie protokolliert man den Fortschritt von Aufgaben in Talend Open Studio?

Antwort

2

Soweit ich weiß, tLogRow Ausgänge an die Konsole. Sie können also problemlos einen Ausgang anschließen.

Wenn tLogRow nicht ausreicht, können Sie Ihren Ausgang an eine TJavaFlex Komponente anschließen. Dort könnten Sie etwas wie log4j oder eine benutzerdefinierte Ausgabe verwenden. Sie können auch tFileDelimitedOutput als Protokolldatei verwenden. Diese Komponente hat eine nette "Anhängen" -Option, die für diesen Anwendungsfall wie ein Zauber wirkt.


Für Ihre Frage oben: Wie die Protokollinformationen

Durch Erfahrung erhalten, kann ich sagen, dass einige Komponenten der Strömung gibt. Zum Beispiel gibt tMysqlInput die erfolgreich eingefügten Zeilen aus.

Um die Informationen zu protokollieren verwende ich im Allgemeinen die Komponente tReplicate, die mir erlaubt, eine Kopie des Flusses in eine Protokolldatei auszugeben.

tMySqlOutput ---- tReplicate ----- tMap -------- tMySqlInput (insert in DB) 
           +---- tMap -------- tDelimitedFile (log info) 
+0

Ich möchte nicht jede Zeile anmelden, sondern nur nur einige Fortschritte Spitzen (wie 50.000 eingefügt 100.000 eingesetzt ... etc) – Bax

+0

Haltungsart Eine statische Variable mit der Anzahl der verarbeiteten Zeilen gibt sie dann aus, wenn Sie es wünschen. Ich glaube nicht, dass etwas bereit ist, zu verwenden. –

+0

das Hauptproblem ist nicht, wie es ausgegeben wird, aber wie man es erhält – Bax

5

Ihre Lösung besteht darin, der Protokollierung eine Bedingungsklausel hinzuzufügen. Etwas wahr eine Zeile jeder, sagen wir mal, 50000. Dieser Zustand unter Verwendung einer Sequenz sollte funktionieren:

Numeric.sequence("log_seq",1,1) % 50000 == 0 

Sie die benutzerdefinierte Komponente verwenden können bcLogBack im Grunde Ausgang Ihre Log eine sl4j Fassade Stack. Die Komponente hat eine Option namens "Bedingte Protokollierung", um die Nachricht nur zu senden, wenn die Bedingung wahr ist.

Wenn Sie die Idee der Installation einer benutzerdefinierten Komponente nicht mögen, können Sie Ihren Unterjob mit dem Standard tLogRow (oder tWarn, tDie oder was auch immer) mit einem Präfix eines tFilter mit demselben Ausdruck wie die erweiterte Bedingung beenden. Auf diese Weise werden Sie den Stream verstreichen lassen (und die Log-Nachricht ausgelöst werden) einmal nur jeder 50000. Hier ist eine sehr einfache Aufgabe Diagramm

//---->tMySqlOutput--->tFilter-----//filter--->tWarn (or tLogRow) 
+0

tFilter scheint eine nette Lösung zu sein. –

1

Sie auch TWARN in Kombination mit tLogCatcher verwenden können:

tMySqlOutput ---- ---- tFilter TWARN

tLogCatcher ---- ---- tMap tLogRow

tFilter würden Sie von der Anmeldung einen Fortschritt auf jeder Zeile Abschluss verhindern (Gabriele B Antwort sehen). tWarn würde die eigentliche Nachricht haben, die Sie abmelden möchten.

tLogCatcher sollte Eingaben von allen tWarns erhalten, tMapper transformiert jede Zeile aus dem logCatcher in eine Ausgabezeile und tLogRow protokolliert sie.

Diese Antwort ist detaillierter (mit Bildern) beschrieben: http://blog.wdcigroup.net/2012/05/error-handling-in-talend-using-tlogcatcher/