Allow a size limit to be imposed on the amount of output that we copy from a bureau process

git-svn-id: svn+ssh://src.earth.threerings.net/narya/trunk@5450 542714f4-19e9-0310-aa3c-eee0fc999fb1
This commit is contained in:
Jamie Doornbos
2008-10-16 22:37:08 +00:00
parent a0771dce79
commit 6fa89df998
@@ -24,6 +24,8 @@ package com.threerings.bureau.util;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.text.DateFormat;
import java.util.Date;
import com.samskivert.io.StreamUtil;
import com.samskivert.util.Logger;
@@ -38,14 +40,26 @@ import static com.threerings.bureau.Log.log;
public class BureauLogRedirector
{
/**
* Creates a new redirector.
* Creates a new redirector with no size limit.
* @param bureauId the id of the bureau being redirected - this will become the thread name
* @param input the stream that is the output of the bureau process
*/
public BureauLogRedirector (String bureauId, InputStream input)
{
this(bureauId, input, 0);
}
/**
* Creates a new redirector.
* @param bureauId the id of the bureau being redirected - this will become the thread name
* @param input the stream that is the output of the bureau process
* @param limit approximate limit for the total characters written to the logger
*/
public BureauLogRedirector (String bureauId, InputStream input, int limit)
{
_bureauId = bureauId;
_reader = new BufferedReader(new InputStreamReader(input));
_limit = limit;
Thread thread = new Thread(bureauId) {
@Override public void run () {
copyLoop();
@@ -62,6 +76,41 @@ public class BureauLogRedirector
return _bureauId;
}
/**
* Gets the total number of characters written to the log.
*/
public int getWritten ()
{
return _written;
}
/**
* Gets the character limit associated with the log.
*/
public int getLimit ()
{
return _limit;
}
/**
* Resets the redirector's truncation status and allows additional output up to the given
* character limit.
*/
public synchronized void reset (int limit)
{
_written = 0;
_truncated = false;
_limit = limit;
}
/**
* Tests if this redirector has stopped copying lines due to the size limit being exceeded.
*/
public boolean isTruncated ()
{
return _truncated;
}
/**
* Returns true if the redirector is still active. Normally this indicates that the launched
* process is still running.
@@ -76,8 +125,30 @@ public class BureauLogRedirector
String line;
try {
while ((line = _reader.readLine()) != null) {
// this should get prefixed by the thread name
_target.info(line);
int length = line.length();
boolean showTrunc = false;
synchronized (this) {
if (_truncated) {
line = null;
} else if (_limit > 0 && _written + length > _limit) {
_truncated = true;
showTrunc = true;
line = null;
}
}
if (line != null) {
_target.info(line); // this should get prefixed by the thread name
_written += length;
} else if (showTrunc) {
DateFormat format =
DateFormat.getDateTimeInstance(DateFormat.FULL, DateFormat.FULL);
_target.info(
format.format(new Date()) +
": Size limit reached, suppressing further output");
}
}
} catch (Exception e) {
log.warning("Failed to read bureau output", "bureauId", _bureauId, e);
@@ -89,6 +160,9 @@ public class BureauLogRedirector
protected String _bureauId;
protected BufferedReader _reader;
protected int _limit;
protected int _written;
protected boolean _truncated;
protected static Logger _target = Logger.getLogger(BureauLogRedirector.class);
}