Created AsyncOutputStreamAppender to support logging output on separate threads

This commit is contained in:
Collin Smith
2020-09-21 02:02:16 -07:00
parent bb4efb7967
commit 6117efc25e
3 changed files with 46 additions and 3 deletions

View File

@ -59,10 +59,10 @@ import com.riiablo.loader.DC6Loader;
import com.riiablo.loader.DCCLoader;
import com.riiablo.loader.IndexLoader;
import com.riiablo.loader.PaletteLoader;
import com.riiablo.logger.AsyncOutputStreamAppender;
import com.riiablo.logger.Level;
import com.riiablo.logger.LogManager;
import com.riiablo.logger.LoggerRegistry;
import com.riiablo.logger.OutputStreamAppender;
import com.riiablo.map.DS1;
import com.riiablo.map.DS1Loader;
import com.riiablo.map.DT1;
@ -239,7 +239,7 @@ public class Client extends Game {
try {
System.setOut(console.out);
System.setErr(console.out);
registry.getRoot().addAppender(new OutputStreamAppender(System.out));
registry.getRoot().addAppender(new AsyncOutputStreamAppender(System.out));
} catch (SecurityException e) {
console.out.println("stdout could not be redirected to console: " + e.getMessage());
throw new GdxRuntimeException("Unable to bind console out.", e);

View File

@ -0,0 +1,43 @@
package com.riiablo.logger;
import java.io.OutputStream;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
public class AsyncOutputStreamAppender implements Appender, Runnable {
private final OutputStream out;
private final Encoder encoder = new RiiabloEncoder();
private final Thread thread;
private final BlockingQueue<LogEvent> queue = new ArrayBlockingQueue<>(1024);
public AsyncOutputStreamAppender(OutputStream out) {
this.out = out;
thread = new Thread(this);
thread.setName("AsyncOutputStreamAppender-Worker");
thread.start();
}
@Override
public Encoder encoder() {
return encoder;
}
@Override
public void append(LogEvent event) {
boolean added = queue.offer(event);
assert added : "event(" + event + ") could not be added to queue!";
}
@Override
public void run() {
for (;;) {
try {
final LogEvent event = queue.take();
encoder.encode(event, out);
event.release();
} catch (InterruptedException ignored) {}
}
}
}

View File

@ -21,7 +21,7 @@ public class LoggerRegistry {
private Logger createRootLogger() {
final Logger root = new Logger(ROOT);
root.level(Level.WARN);
root.addAppender(new OutputStreamAppender(System.out));
root.addAppender(new AsyncOutputStreamAppender(System.out));
loggers.put(ROOT, root);
contexts.put(ROOT, root.level());
return root;