Logger: Configurable flush interval

This commit is contained in:
zzz
2014-11-18 14:49:23 +00:00
parent 8f8adfa39e
commit 31cc0764a9
2 changed files with 35 additions and 2 deletions

View File

@ -61,6 +61,8 @@ public class LogManager {
private static final String PROP_DROP = "logger.dropOnOverflow"; private static final String PROP_DROP = "logger.dropOnOverflow";
/** @since 0.9.3 */ /** @since 0.9.3 */
private static final String PROP_DUP = "logger.dropDuplicates"; private static final String PROP_DUP = "logger.dropDuplicates";
/** @since 0.9.18 */
private static final String PROP_FLUSH = "logger.flushInterval";
public final static String PROP_RECORD_PREFIX = "logger.record."; public final static String PROP_RECORD_PREFIX = "logger.record.";
public final static String DEFAULT_FORMAT = DATE + " " + PRIORITY + " [" + THREAD + "] " + CLASS + ": " + MESSAGE; public final static String DEFAULT_FORMAT = DATE + " " + PRIORITY + " [" + THREAD + "] " + CLASS + ": " + MESSAGE;
@ -125,6 +127,8 @@ public class LogManager {
private boolean _dropOnOverflow; private boolean _dropOnOverflow;
private boolean _dropDuplicates; private boolean _dropDuplicates;
private final AtomicLong _droppedRecords = new AtomicLong(); private final AtomicLong _droppedRecords = new AtomicLong();
// in seconds
private int _flushInterval = (int) (LogWriter.FLUSH_INTERVAL / 1000);
private boolean _alreadyNoticedMissingConfig; private boolean _alreadyNoticedMissingConfig;
@ -160,6 +164,7 @@ public class LogManager {
if (_writer != null) if (_writer != null)
return; return;
_writer = new LogWriter(this); _writer = new LogWriter(this);
_writer.setFlushInterval(_flushInterval * 1000);
// if you enable logging in I2PThread again, you MUST change this back to Thread // if you enable logging in I2PThread again, you MUST change this back to Thread
Thread t = new I2PThread(_writer, "LogWriter"); Thread t = new I2PThread(_writer, "LogWriter");
t.setDaemon(true); t.setDaemon(true);
@ -269,6 +274,10 @@ public class LogManager {
try { try {
_records.put(record); _records.put(record);
} catch (InterruptedException ie) {} } catch (InterruptedException ie) {}
} else if (_flushInterval <= 0) {
synchronized (_writer) {
_writer.notifyAll();
}
} }
} }
@ -384,6 +393,17 @@ public class LogManager {
_logBufferSize = Integer.parseInt(str); _logBufferSize = Integer.parseInt(str);
} catch (NumberFormatException nfe) {} } catch (NumberFormatException nfe) {}
try {
String str = config.getProperty(PROP_FLUSH);
if (str != null) {
_flushInterval = Integer.parseInt(str);
synchronized(this) {
if (_writer != null)
_writer.setFlushInterval(_flushInterval * 1000);
}
}
} catch (NumberFormatException nfe) {}
_dropOnOverflow = Boolean.parseBoolean(config.getProperty(PROP_DROP)); _dropOnOverflow = Boolean.parseBoolean(config.getProperty(PROP_DROP));
String str = config.getProperty(PROP_DUP); String str = config.getProperty(PROP_DUP);
_dropDuplicates = str == null || Boolean.parseBoolean(str); _dropDuplicates = str == null || Boolean.parseBoolean(str);
@ -647,6 +667,7 @@ public class LogManager {
rv.setProperty(PROP_DEFAULTLEVEL, Log.toLevelString(_defaultLimit)); rv.setProperty(PROP_DEFAULTLEVEL, Log.toLevelString(_defaultLimit));
rv.setProperty(PROP_DISPLAYONSCREENLEVEL, Log.toLevelString(_onScreenLimit)); rv.setProperty(PROP_DISPLAYONSCREENLEVEL, Log.toLevelString(_onScreenLimit));
rv.setProperty(PROP_CONSOLEBUFFERSIZE, Integer.toString(_consoleBufferSize)); rv.setProperty(PROP_CONSOLEBUFFERSIZE, Integer.toString(_consoleBufferSize));
rv.setProperty(PROP_FLUSH, Integer.toString(_flushInterval));
for (LogLimit lim : _limits) { for (LogLimit lim : _limits) {
rv.setProperty(PROP_RECORD_PREFIX + lim.getRootName(), Log.toLevelString(lim.getLimit())); rv.setProperty(PROP_RECORD_PREFIX + lim.getRootName(), Log.toLevelString(lim.getLimit()));

View File

@ -25,7 +25,9 @@ import java.util.Queue;
class LogWriter implements Runnable { class LogWriter implements Runnable {
/** every 10 seconds? why? Just have the gui force a reread after a change?? */ /** every 10 seconds? why? Just have the gui force a reread after a change?? */
private final static long CONFIG_READ_INTERVAL = 50 * 1000; private final static long CONFIG_READ_INTERVAL = 50 * 1000;
private final static long FLUSH_INTERVAL = 29 * 1000; final static long FLUSH_INTERVAL = 29 * 1000;
private final static long MIN_FLUSH_INTERVAL = 2*1000;
private final static long MAX_FLUSH_INTERVAL = 5*60*1000;
private long _lastReadConfig; private long _lastReadConfig;
private long _numBytesInCurrentFile; private long _numBytesInCurrentFile;
// volatile as it changes on log file rotation // volatile as it changes on log file rotation
@ -38,6 +40,8 @@ class LogWriter implements Runnable {
private static final int MAX_DISKFULL_MESSAGES = 8; private static final int MAX_DISKFULL_MESSAGES = 8;
private int _diskFullMessageCount; private int _diskFullMessageCount;
private LogRecord _last; private LogRecord _last;
// ms
private volatile long _flushInterval = FLUSH_INTERVAL;
public LogWriter(LogManager manager) { public LogWriter(LogManager manager) {
_manager = manager; _manager = manager;
@ -48,6 +52,14 @@ class LogWriter implements Runnable {
_write = false; _write = false;
} }
/**
* @param ms
* @since 0.9.18
*/
public void setFlushInterval(long interval) {
_flushInterval = Math.min(MAX_FLUSH_INTERVAL, Math.max(MIN_FLUSH_INTERVAL, interval));
}
public void run() { public void run() {
_write = true; _write = true;
try { try {
@ -109,7 +121,7 @@ class LogWriter implements Runnable {
if (shouldWait) { if (shouldWait) {
try { try {
synchronized (this) { synchronized (this) {
this.wait(FLUSH_INTERVAL); this.wait(_flushInterval);
} }
} catch (InterruptedException ie) { // nop } catch (InterruptedException ie) { // nop
} }