Talend Open Studio控制台输出未全部插入MongoDB问题咨询
Talend Open Studio 剩余控制台输出写入MongoDB操作方案
你已完成文件属性表的MongoDB写入,要把总记录数、当前作业名称以日志形式入库,直接按以下步骤操作即可,不需要额外解析控制台文本,稳定性远高于日志抓取方案:
- 优先使用全局变量直接取值(推荐方案)
控制台打印的作业名、总记录数本身就是Talend运行时自动存在全局变量里的值,不需要爬控制台输出:- 当前作业名称直接调用内置全局变量获取:
(String)globalMap.get("jobName"),全作业任意节点都能读取,和控制台打印的作业名完全一致 - 总记录数对应输入组件的行数统计变量,格式为
(Integer)globalMap.get("你的输入组件名_NB_LINE"),比如你用的输入组件叫tFileInputDelimited_1,就写(Integer)globalMap.get("tFileInputDelimited_1_NB_LINE"),这个值就是控制台输出的Total Records数值,组件执行完成后自动生成,不存在解析误差
取值后在作业末尾(所有业务子任务执行完成后,通过OnSubjobOk触发器连接)新增tFixedFlowInput组件,定义日志文档字段,把作业名、总记录数、日志生成时间、关联的文件属性信息都组装好,直接对接你已经在用的tMongoDBOutput组件,写入专门的作业日志集合即可,和你之前写入文件属性表的配置逻辑完全一致。
- 当前作业名称直接调用内置全局变量获取:
- 全量控制台捕获备选方案
如果后续需要把控制台所有输出(包括报错、自定义打印信息)全量写入MongoDB,可以用输出流重定向的方式实现:- 在作业最起始位置加tJava组件,写入重定向代码:
java.io.ByteArrayOutputStream logStream = new java.io.ByteArrayOutputStream(); System.setOut(new java.io.PrintStream(logStream)); globalMap.put("talendConsoleLog", logStream);- 在作业所有逻辑的末尾加tJavaRow/tFixedFlowInput组件,从全局变量中取出日志流转为字符串:
String fullConsoleLog = ((java.io.ByteArrayOutputStream)globalMap.get("talendConsoleLog")).toString();- 把全量日志文本和作业名、记录数等字段一起组装成MongoDB文档,写入对应集合即可。这个方案适合需要留存全量控制台日志的场景,数据量较大时会占用部分JVM内存,非必要优先选全局变量取值方案。
注意:不建议依赖tStatCatcher、tLogCatcher默认统计功能实现,默认统计字段不会携带你需要的业务侧文件属性、自定义打印的总记录数值,自定义字段组装的方式可控性更高。
内容的提问来源于stack exchange,提问作者Akash Tripathi
相关产品推荐
相关产品推荐

