java无法将kettle日志写入log
- 2014-04-11 16:22:00
- 1147533288 原创
- 2547
通过重写kettle-core.jar包中的LogWriter增加日志输出解决。
解决问题版本为kettle4.3。5以后版本,请另想办法找下。
1.src代码下增加LogWriter.java文件(源代码可通过Java Decompiler反编译class得到)<!--more-->
[code lang="java"]
package org.pentaho.di.core.logging;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintStream;
import java.util.Enumeration;
import org.apache.commons.vfs.FileName;
import org.apache.commons.vfs.FileObject;
import org.apache.log4j.*;
import org.pentaho.di.core.Const;
import org.pentaho.di.core.exception.KettleException;
import org.pentaho.di.core.exception.KettleFileException;
import org.pentaho.di.core.vfs.KettleVFS;
public class LogWriter
{
private static LogWriter logWriter;
public static final String STRING_PENTAHO_DI_LOGGER_NAME = "org.pentaho.di";
public static final String STRING_PENTAHO_DI_CONSOLE_APPENDER = "ConsoleAppender:org.pentaho.di";
private int type;
private String filter;
private Logger pentahoLogger;
private Log4jFileAppender fileAppender;
private File realFilename;
private static Layout layout;
public static final LogWriter getInstance()
{
if (logWriter != null)
{
return logWriter;
}
logWriter = new LogWriter();
return logWriter;
}
private LogWriter()
{
this.pentahoLogger = Logger.getLogger("org.pentaho.di");
this.pentahoLogger.setAdditivity(false);
this.pentahoLogger.setLevel(Level.ALL);
layout = new Log4jKettleLayout();
boolean consoleAppenderFound = false;
Enumeration appenders = this.pentahoLogger.getAllAppenders();
while (appenders.hasMoreElements()) {
Appender appender = (Appender)appenders.nextElement();
if (appender instanceof ConsoleAppender) {
consoleAppenderFound = true;
break;
}
}
if (!(consoleAppenderFound)) {
Layout patternLayout = new PatternLayout("%-5p %d{dd-MM HH:mm:ss,SSS} - %m%n");
ConsoleAppender consoleAppender = new ConsoleAppender(patternLayout);
consoleAppender.setName("ConsoleAppender:org.pentaho.di");
this.pentahoLogger.addAppender(consoleAppender);
try {
Logger.getLogger("org.pentaho.di").addAppender(new FileAppender(new SimpleLayout(), "job.log"));
} catch (IOException e) {
e.printStackTrace();
}
}
LogManager.getLogger("org.apache.commons.vfs").setLevel(Level.WARN);
}
public static final LogWriter getInstance(String filename, boolean exact)
throws KettleException
{
if (logWriter != null)
{
if (logWriter.pentahoLogger.getAppender(createFileAppenderName(filename, exact)) == null)
{
logWriter.fileAppender = createFileAppender(filename, exact);
logWriter.addAppender(logWriter.fileAppender);
}
return logWriter;
}
logWriter = new LogWriter(filename, exact);
return logWriter;
}
public static final void closeAndRemoveFileAppender()
{
if (logWriter.fileAppender != null) {
logWriter.fileAppender.close();
logWriter.pentahoLogger.removeAppender(logWriter.fileAppender);
}
}
private LogWriter(String filename, boolean exact)
{
try
{
this.fileAppender = createFileAppender(filename, exact);
addAppender(this.fileAppender);
}
catch (Exception e)
{
System.out.println("ERROR OPENING LOG FILE [" + filename + "] --> " + e.toString());
}
}
public static final Log4jFileAppender createFileAppender(String filename, boolean exact)
throws KettleFileException
{
try
{
FileObject file;
if (!(exact))
{
file = KettleVFS.createTempFile(filename, ".log", System.getProperty("java.io.tmpdir"));
}
else
{
file = KettleVFS.getFileObject(filename);
}
Log4jFileAppender appender = new Log4jFileAppender(file);
appender.setLayout(new Log4jKettleLayout(true));
appender.setName(createFileAppenderName(filename, exact));
return appender;
}
catch (IOException e)
{
throw new KettleFileException("Unable to add Kettle file appender to Log4J", e);
}
}
public static final Log4jFileAppender createFileAppender(String filename, boolean exact, boolean append)
throws KettleFileException
{
try
{
FileObject file;
if (!(exact))
{
file = KettleVFS.createTempFile(filename, ".log", System.getProperty("java.io.tmpdir"));
}
else
{
file = KettleVFS.getFileObject(filename);
}
Log4jFileAppender appender = new Log4jFileAppender(file, append);
appender.setLayout(new Log4jKettleLayout(true));
appender.setName(createFileAppenderName(filename, exact));
return appender;
}
catch (IOException e)
{
throw new KettleFileException("Unable to add Kettle file appender to Log4J", e);
}
}
public static final String createFileAppenderName(String filename, boolean exact)
{
if (!(exact))
{
return "<temp file> : " + filename;
}
return filename;
}
/** @deprecated */
public static final Log4jStringAppender createStringAppender()
{
Log4jStringAppender appender = new Log4jStringAppender();
appender.setLayout(new Log4jKettleLayout(true));
return appender;
}
public static void setConsoleAppenderDebug() {
Enumeration appenders = Logger.getLogger("org.pentaho.di").getAllAppenders();
while (appenders.hasMoreElements())
{
Object appender = appenders.nextElement();
if ((((appender instanceof ConsoleAppender) || (appender instanceof Log4jConsoleAppender))) &&
(appender instanceof ConsoleAppender))
((ConsoleAppender)appender).setThreshold(Level.DEBUG);
}
}
public int getType()
{
return this.type;
}
public void setType(int type)
{
this.type = type;
}
public boolean close()
{
boolean retval = true;
try
{
Logger logger = Logger.getLogger("org.pentaho.di");
Enumeration appenders = logger.getAllAppenders();
while (appenders.hasMoreElements())
{
Appender appender = (Appender)appenders.nextElement();
appender.close();
}
this.pentahoLogger.removeAllAppenders();
logWriter = null;
}
catch (Exception e)
{
retval = false;
}
return retval;
}
public void println(LogMessageInterface logMessage, LogLevel channelLogLevel)
{
String subject = null;
LogLevel logLevel = logMessage.getLevel();
if (!(logLevel.isVisible(channelLogLevel))) {
return;
}
if (subject == null) subject = "Kettle";
if ((!(logLevel.isError())) && (!(Const.isEmpty(this.filter))) &&
(subject.indexOf(this.filter) < 0) && (logMessage.toString().indexOf(this.filter) < 0))
{
return;
}
switch (logLevel.ordinal())
{
case 1:
this.pentahoLogger.error(logMessage); break;
case 2:
case 3:
this.pentahoLogger.debug(logMessage); break;
default:
this.pentahoLogger.info(logMessage);
}
}
public void println(LogMessageInterface message, Throwable e, LogLevel channelLogLevel) {
println(message, channelLogLevel);
String stackTrace = Const.getStackTracker(e);
LogMessage traceMessage = new LogMessage(stackTrace, message.getLogChannelId(), LogLevel.ERROR);
println(traceMessage, channelLogLevel);
}
public void setFilter(String filter)
{
this.filter = filter;
}
public String getFilter()
{
return this.filter;
}
public InputStream getFileInputStream()
throws IOException
{
return KettleVFS.getInputStream(this.fileAppender.getFile());
}
public FileObject getFileAppenderFile()
throws IOException
{
return this.fileAppender.getFile();
}
public FileInputStream getFileInputStream(String filename, boolean exact)
throws IOException
{
Appender appender = this.pentahoLogger.getAppender(createFileAppenderName(filename, exact));
if (appender == null)
{
throw new IOException("Unable to find appender for file: " + filename + " (exact=" + exact + ")");
}
return new FileInputStream(((Log4jFileAppender)appender).getFile().getName().getPathDecoded());
}
public File getRealFilename()
{
return this.realFilename;
}
public void setRealFilename(File realFilename)
{
this.realFilename = realFilename;
}
public void addAppender(Appender appender)
{
this.pentahoLogger.addAppender(appender);
}
public void removeAppender(Appender appender)
{
this.pentahoLogger.removeAppender(appender);
}
public static void setLayout(Layout layout)
{
layout = layout;
Enumeration appenders = logWriter.pentahoLogger.getAllAppenders();
while (appenders.hasMoreElements())
{
Appender appender = (Appender)appenders.nextElement();
if ((appender instanceof Log4jConsoleAppender) || (appender instanceof Log4jFileAppender) || (appender instanceof Log4jBufferAppender))
{
appender.setLayout(layout);
}
}
}
public static Layout getLayout()
{
return layout;
}
}
[/code]
2.注意修改关键点 try{}catch{}部分为新增写入日志的地方,这里写入程序目录下job.log与log4j.properties(同样写入job.log)一致即可。
[code lang="java"]
if (!(consoleAppenderFound)) {
Layout patternLayout = new PatternLayout("%-5p %d{dd-MM HH:mm:ss,SSS} - %m%n");
ConsoleAppender consoleAppender = new ConsoleAppender(patternLayout);
consoleAppender.setName("ConsoleAppender:org.pentaho.di");
this.pentahoLogger.addAppender(consoleAppender);
try {
Logger.getLogger("org.pentaho.di").addAppender(new FileAppender(new SimpleLayout(), "job.log"));
} catch (IOException e) {
e.printStackTrace();
}
}
[/code]
3.输出效果:
<code>
2014-04-08 05:14:29.978 INFO [com.neusoft.job.trans.thread.TransTask.run(TransTask.java:152)] - ----TransTask 住院.xml:程序开始运行----
2014-04-08 05:14:29.994 DEBUG [com.neusoft.job.trans.thread.TransTask.task(TransTask.java:112)] - ----------------执行sql为:
DEBUG - 住院首页 - 为了转换解除补丁开始 [住院首页]
DEBUG - DI_FIRSTPAGEMEDICALRECORD 2 - Connected to database [targetDB] (commit=1000)
DEBUG - DI_FIRSTPAGEMEDICALRECORD - Finished reading query, closing connection.
DEBUG - DI_FIRSTPAGEMEDICALRECORD - 完成处理 (I=9, O=0, R=0, W=9, U=0, E=0
DEBUG - DI_FIRSTPAGEMEDICALRECORD 2 - 完成处理 (I=0, O=9, R=9, W=9, U=0, E=0
2014-04-08 05:14:30.319 INFO [com.neusoft.job.trans.thread.TransTask.run(TransTask.java:175)] - ----TransTask 住院.xml:程序结束运行----,程序运行时间【341毫秒】
</code>
文章分类
联系我
| 联系人: | meepo |
|---|---|
| 电话: | ***** |
| Email: | 1147533288@qq.com |
| QQ: | 1147533288 |