mirror of
https://github.com/collinsmith/riiablo.git
synced 2025-07-06 00:08:19 +07:00
Created AsyncOutputStreamAppender to support logging output on separate threads
This commit is contained in:
@ -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);
|
||||
|
43
core/src/com/riiablo/logger/AsyncOutputStreamAppender.java
Normal file
43
core/src/com/riiablo/logger/AsyncOutputStreamAppender.java
Normal 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) {}
|
||||
}
|
||||
}
|
||||
}
|
@ -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;
|
||||
|
Reference in New Issue
Block a user