package com.redhat.qe.tools;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
* Logs the output of an SSH command
* @author weissj
*
*/
public class SplitStreamLogger {
protected SSHCommandRunner runner=null;
protected InputStream stdout;
protected InputStream stderr;
protected static Logger log = Logger.getLogger(SplitStreamLogger.class.getName());
StreamLogger sl_out;
StreamLogger sl_err;
public SplitStreamLogger(SSHCommandRunner runner){
this.runner = runner;
this.stdout = runner.getStdoutStream();
this.stderr = runner.getStdErrStream();
}
public SplitStreamLogger(InputStream stdout, InputStream stderr){
this.stdout = stdout;
this.stderr = stderr;
}
public void log(Level outlevel, Level errlevel){
sl_out = new StreamLogger(stdout, outlevel,"Stdout");
sl_err = new StreamLogger(stderr, errlevel,"Stderr");
Thread out = new Thread(sl_out);
Thread err = new Thread(sl_err);
out.start();
err.start();
}
public String getStdout(){
return sl_out.toString();
}
public String getStderr(){
return sl_err.toString();
}
public void log(){
log(Level.INFO, Level.SEVERE);
}
class StreamLogger implements Runnable{
protected String name;
protected InputStream stream;
protected Level level;
protected StringBuffer sb = new StringBuffer();
public StreamLogger(InputStream stream, Level level, String name){
this.name = name;
this.stream = stream;
this.level = level;
}
public String toString(){
synchronized (sb) {
return sb.toString();
}
}
public void run(){
String line;
BufferedReader reader = new BufferedReader(new InputStreamReader(stream));
try {
while ((line = reader.readLine()) != null){
synchronized (sb) {
sb.append(line + "\n");
// The user@hostname information is already logged by the prior SSHCommandRunner call to run a command. No need to log it again on every line of command output. jsefler 4/5/2010
// if (runner!=null) log.log(level, String.format("[%s@%s] %s: %s", runner.user,runner.getConnection().getHostname(),name,line));
// else log.log(level, String.format("%s: %s", name,line));
log.log(level, String.format("%s: %s", name,line));
}
}
}
catch (IOException e) {
e.printStackTrace();
} finally {
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}