我有一些将数据从一个数据库迁移到另一个数据库的示例作业,我想了解有关当前进度的一些信息,例如从应用程序本身以交互方式运行作业时所拥有的信息(我从命令行导出并运行它) )。我使用 flowMeter 和 statsCatcher 但我得到的只是总时间和通过的记录总数(例如 4657 秒,50.000.000 行)。有什么解决方案可以得到一个像样的日志吗?
3 回答
您的解决方案是在日志记录中添加条件子句。每隔一行,假设 50000 是真的。使用序列的这个条件应该有效:
Numeric.sequence("log_seq",1,1) % 50000 == 0
您可以使用自定义组件bcLogBack基本上使用 sl4j 外观堆栈输出您的日志。该组件有一个名为“条件日志记录”的选项,仅当条件评估为真时才发送消息。
或者,如果您不喜欢安装自定义组件的想法,您可以使用标准 tLogRow(或 tWarn、tDie 或其他)结束您的子作业,并使用与高级条件相同的表达式作为前缀的 tFilter。这样,您将每 50000 次让流通过(以及要触发的日志消息)一次。这是一个非常基本的工作图
//---->tMySqlOutput--->tFilter-----//filter--->tWarn (or tLogRow)
据我所知,tLogRow
输出到控制台。因此,您可以轻松地将输出插入其中。
如果tLogRow
还不够,您可以将输出插入到TJavaFlex
组件中。在那里你可以使用类似 log4j 或任何自定义输出的东西。
您也可以tFileDelimitedOutput
用作日志文件。这个组件有一个很好的“附加”选项,就像这个用例的魅力一样。
对于您上面的问题:如何获取日志信息
根据经验,我可以说某些组件输出流。例如,tMysqlInput
输出成功插入的行。
通常,为了记录信息,我使用tReplicate
允许我将流的副本输出到日志文件的组件。
tMySqlOutput ---- tReplicate ----- tMap -------- tMySqlInput (insert in DB)
+---- tMap -------- tDelimitedFile (log info)
您还可以将 tWarn 与 tLogCatcher 结合使用:
tMySqlOutput ---- tFilter ---- tWarn
tLogCatcher ---- tMap ---- tLogRow
tFilter 会阻止您记录每行完成的进度(请参阅 Gabriele B 的回答)。tWarn 将包含您要注销的实际消息。
tLogCatcher 应该从所有 tWarns 中获取输入,tMapper 将 logCatcher 中的每一行转换为输出行,然后 tLogRow 记录它。
该答案更详细地描述(带图片):http ://blog.wdcigroup.net/2012/05/error-handling-in-talend-using-tlogcatcher/