java kettle 日志 log_kettle日志添加字段的源码修改

本文介绍了如何在Kettle中通过修改LogTableInterface及相关实现类的源码,为日志添加jobName字段。详细步骤包括在接口中添加方法,实现类中实现该方法,并在Trans.java和Database.java中调用。最后列出所有修改的文件并说明了编译和测试过程。
摘要由CSDN通过智能技术生成

LogTableInterface.java(/kettle4.2/src-db/org/pentaho/di/core/logging/LogTableInterface.java)

73、74行添加接口方法://增加jobName参数 mengshanfeng

public RowMetaAndDatagetLogRecord(LogStatus status, Object subject, Object parent,String jobName);

保存后,会报如下几个实现此接口的实现类的错误,依次实现空方法即可。

ChannelLogTable(/kettle4.2/src/org/pentaho/di/core/logging/ChannelLogTable.java)

JobEntryLogTable(/kettle4.2/src/org/pentaho/di/core/logging/JobEntryLogTable.java)

JobLogTable(/kettle4.2/src/org/pentaho/di/core/logging/JobLogTable.java)

PerformanceLogTable(/kettle4.2/src/org/pentaho/di/core/logging/PerformanceLogTable.java)

StepLogTable(/kettle4.2/src/org/pentaho/di/core/logging/StepLogTable.java)

TransLogTable(/kettle4.2/src/org/pentaho/di/core/logging/TransLogTable.java)

777d3dc152b91a55dc7d3e2bc20da268

TransLogTable.java(/kettle4.2/src/org/pentaho/di/core/logging/TransLogTable.java)

48、49行添加类变量//mengshanfeng

public static String jobName = "";

330-374行注释掉//并用如下代码代替:

return getLogRecord(status,subject,parent,TransLogTable.jobName);

378-433添加接口方法的实现

//增加jobName参数 mengshanfeng

public RowMetaAndData getLogRecord(LogStatus status, Object subject, Object parent,String jobName) {

//mengshanfeng

if(jobName!=null && !"".equals(jobName)){

TransLogTable.jobName = jobName;

}

if (subject==null || subject instanceof Trans) {

Trans trans = (Trans) subject;

Result result = null;

if (trans!=null) result = trans.getResult();

RowMetaAndData row = new RowMetaAndData();

int tt = 0;

for (LogTableField field : fields) {

if (field.isEnabled()) {

Object value = null;

if (trans!=null) {

switch(ID.valueOf(field.getId())){

case ID_BATCH : value = new Long(trans.getBatchId()); break;

case CHANNEL_ID : value = trans.getLogChannelId(); break;

case TRANSNAME : value = trans.getName(); break;

case STATUS : value = status.getStatus(); break;

case LINES_READ : value = new Long(result.getNrLinesRead()); break;

case LINES_WRITTEN : value = new Long(result.getNrLinesWritten()); break;

case LINES_INPUT : value = new Long(result.getNrLinesInput()); break;

case LINES_OUTPUT : value = new Long(result.getNrLinesOutput()); break;

case LINES_UPDATED : value = new Long(result.getNrLinesUpdated()); break;

case LINES_REJECTED : value = new Long(result.getNrLinesRejected()); break;

case ERRORS: value = new Long(result.getNrErrors()); break;

case STARTDATE: value = trans.getStartDate(); break;

case LOGDATE: value = trans.getLogDate(); break;

case ENDDATE: value = trans.getEndDate(); break;

case DEPDATE: value = trans.getDepDate(); break;

case REPLAYDATE: value = trans.getCurrentDate(); break;

case LOG_FIELD:

value = getLogBuffer(trans, trans.getLogChannelId(),status, logSizeLimit);

break;

}

}

tt = field.getDataType();

row.addValue(field.getFieldName(), field.getDataType(), value);

row.getRowMeta().getValueMeta(row.size()-1).setLength(field.getLength());

}

}

//增加两句话 mengshanfeng

row.addValue("jobName", tt, TransLogTable.jobName);

row.getRowMeta().getValueMeta(row.size()-1).setLength(10);

return row;

}

else {

return null;

}

}

Trans.java(/kettle4.2/src/org/pentaho/di/trans/Trans.java)

1692行添加函数调用参数

 //增加jobName参数 mengshanfeng

transLogTableDatabaseConnection.writeLogRecord(transLogTable,LogStatus.START, this, null,parentJob.getJobname());

Database.java(/kettle4.2/src-db/org/pentaho/di/core/database/Database.java)

3621-3670行添加一个多态函数    //增加同名函数,多一个jobName参数mengshanfeng

public void writeLogRecord(LogTableInterface logTable, LogStatus status, Object subject, Object parent,String jobName) throws KettleException {

try {

//增加jobName参数 mengshanfeng

RowMetaAndData logRecord = logTable.getLogRecord(status, subject, parent,jobName);

if (logRecord==null) return;

boolean update = (logTable.getKeyField()!=null) && !status.equals(LogStatus.START);

String schemaTable = databaseMeta.getQuotedSchemaTableCombination(

environmentSubstitute(logTable.getActualSchemaName()),

environmentSubstitute(logTable.getActualTableName())

);

RowMetaInterface rowMeta = logRecord.getRowMeta();

Object[] rowData = logRecord.getData();

if (update) {

RowMetaInterface updateRowMeta = new RowMeta();

Object[] updateRowData = new Object[rowMeta.size()];

ValueMetaInterface keyValueMeta = rowMeta.getValueMeta(0);

StringBuffer sqlBuff = new StringBuffer(250);

sqlBuff.append("UPDATE ").append( schemaTable ).append(" SET ");

for (int i = 1; i < rowMeta.size() ; i++) // Without ID_JOBor ID_BATCH

{

ValueMetaInterfacevalueMeta = rowMeta.getValueMeta(i);

if (i>1) {

sqlBuff.append(", ");

}

sqlBuff.append(databaseMeta.quoteField(valueMeta.getName())).append("=? ");

updateRowMeta.addValueMeta(valueMeta);

updateRowData[i-1] = rowData[i];

}

sqlBuff.append("WHERE").append(databaseMeta.quoteField(keyValueMeta.getName())).append("=? ");

updateRowMeta.addValueMeta(keyValueMeta);

updateRowData[rowMeta.size()-1] = rowData[0];

String sql = sqlBuff.toString();

execStatement(sql, updateRowMeta, updateRowData);

} else {

insertRow(environmentSubstitute(logTable.getActualSchemaName()),environmentSubstitute(logTable.getActualTableName()), logRecord.getRowMeta(), logRecord.getData());

}

} catch(Exception e) {

throw new KettleDatabaseException("Unable to write log record to log table " + logTable.getActualTableName(), e);

}

}

最终修改列表如下:

/kettle4.2/src-db/org/pentaho/di/core/logging/LogTableInterface.java

/kettle4.2/src-db/org/pentaho/di/core/database/Database.java

/kettle4.2/src/org/pentaho/di/core/logging/ChannelLogTable.java

/kettle4.2/src/org/pentaho/di/core/logging/JobEntryLogTable.java

/kettle4.2/src/org/pentaho/di/core/logging/JobLogTable.java

/kettle4.2/src/org/pentaho/di/core/logging/PerformanceLogTable.java

/kettle4.2/src/org/pentaho/di/core/logging/StepLogTable.java

/kettle4.2/src/org/pentaho/di/core/logging/TransLogTable.java

/kettle4.2/src/org/pentaho/di/trans/Trans.java

编译进Jar,进行测试即可。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值