SubServers-2/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/Internal/InternalSubLogger.java

207 lines
7.3 KiB
Java
Raw Normal View History

2016-12-24 05:55:17 +01:00
package net.ME1312.SubServers.Bungee.Host.Internal;
2016-12-05 04:21:04 +01:00
import net.ME1312.SubServers.Bungee.Host.SubLogFilter;
import net.ME1312.SubServers.Bungee.Host.SubLogger;
2016-12-24 05:55:17 +01:00
import net.ME1312.SubServers.Bungee.Library.Container;
2017-01-11 23:07:03 +01:00
import net.ME1312.SubServers.Bungee.Library.NamedContainer;
import net.ME1312.SubServers.Bungee.Library.Util;
2017-08-15 11:58:48 +02:00
import net.ME1312.SubServers.Bungee.SubAPI;
import net.md_5.bungee.api.ProxyServer;
2016-12-05 04:21:04 +01:00
import java.io.*;
2017-01-11 23:07:03 +01:00
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
2017-01-11 23:07:03 +01:00
import java.util.LinkedList;
import java.util.List;
import java.util.logging.Level;
2016-12-05 04:21:04 +01:00
import java.util.regex.Matcher;
import java.util.regex.Pattern;
2017-01-07 20:06:54 +01:00
/**
* Internal Process Logger Class
*/
public class InternalSubLogger extends SubLogger {
protected Process process;
private Object handle;
protected String name;
protected Container<Boolean> log;
private List<SubLogFilter> filters = new ArrayList<SubLogFilter>();
2017-01-11 23:07:03 +01:00
private List<LogMessage> messages = new LinkedList<LogMessage>();
protected File file;
2016-12-29 08:29:22 +01:00
private PrintWriter writer = null;
private boolean started = false;
2017-01-07 20:06:54 +01:00
private Thread out = null;
private Thread err = null;
2016-12-05 04:21:04 +01:00
2017-01-07 20:06:54 +01:00
/**
* Creates a new Internal Process Logger
*
* @param process Process
* @param user Object using this logger (or null)
2017-01-07 20:06:54 +01:00
* @param name Prefix
* @param log Console Logging Status
* @param file File to log to (or null for disabled)
*/
protected InternalSubLogger(Process process, Object user, String name, Container<Boolean> log, File file) {
2016-12-29 08:29:22 +01:00
this.process = process;
this.handle = user;
2016-12-05 04:21:04 +01:00
this.name = name;
this.log = log;
2017-01-07 20:06:54 +01:00
this.file = file;
}
@Override
2017-01-07 20:06:54 +01:00
public void start() {
started = true;
if (file != null && writer == null) {
2016-12-05 04:21:04 +01:00
try {
this.writer = new PrintWriter(file, "UTF-8");
2017-01-07 20:06:54 +01:00
this.writer.println("---------- LOG START \u2014 " + name + " ----------");
this.writer.flush();
2016-12-05 04:21:04 +01:00
} catch (UnsupportedEncodingException | FileNotFoundException e) {
e.printStackTrace();
}
2016-12-29 08:29:22 +01:00
}
2017-01-07 20:06:54 +01:00
if (out == null) (out = new Thread(() -> start(process.getInputStream(), false))).start();
if (err == null) (err = new Thread(() -> start(process.getErrorStream(), true))).start();
List<SubLogFilter> filters = new ArrayList<SubLogFilter>();
filters.addAll(this.filters);
2017-01-11 23:07:03 +01:00
for (SubLogFilter filter : filters) try {
filter.start();
} catch (Throwable e) {
new InvocationTargetException(e, "Exception while running SubLogger Event").printStackTrace();
}
2017-01-07 20:06:54 +01:00
}
2017-08-15 11:58:48 +02:00
@SuppressWarnings("deprecation")
2017-01-07 20:06:54 +01:00
private void start(InputStream in, boolean isErr) {
try {
BufferedReader br = new BufferedReader(new InputStreamReader(in));
String line;
while ((line = br.readLine()) != null) {
if (!line.startsWith(">")) {
2017-01-11 23:07:03 +01:00
String msg = line;
Level level;
// REGEX Formatting
String type = "";
2017-08-15 11:58:48 +02:00
Matcher matcher = Pattern.compile("^((?:\\s*\\[?([0-9]{2}:[0-9]{2}:[0-9]{2})]?)?[\\s\\/\\\\\\|]*(?:\\[|\\[.*\\/)?(MESSAGE|INFO|WARNING|WARN|ERROR|ERR|SEVERE)\\]?:?(?:\\s*>)?\\s*)").matcher(msg.replaceAll("\u001B\\[[;\\d]*m", ""));
2017-01-11 23:07:03 +01:00
while (matcher.find()) {
type = matcher.group(3).toUpperCase();
}
2017-01-31 04:04:37 +01:00
msg = msg.replaceAll("^((?:\\s*\\[?([0-9]{2}:[0-9]{2}:[0-9]{2})]?)?[\\s\\/\\\\\\|]*(?:\\[|\\[.*\\/)?(MESSAGE|INFO|WARNING|WARN|ERROR|ERR|SEVERE)\\]?:?(?:\\s*>)?\\s*)", "");
2017-01-11 23:07:03 +01:00
// Determine LOG LEVEL
switch (type) {
case "WARNING":
case "WARN":
level = Level.WARNING;
break;
case "SEVERE":
case "ERROR":
case "ERR":
level = Level.SEVERE;
break;
default:
level = Level.INFO;
}
2017-01-01 20:34:46 +01:00
2017-01-11 23:07:03 +01:00
// Filter Message
boolean allow = log.get() && (!SubAPI.getInstance().getInternals().canSudo || SubAPI.getInstance().getInternals().sudo == null || SubAPI.getInstance().getInternals().sudo == getHandler());
List<SubLogFilter> filters = new ArrayList<SubLogFilter>();
filters.addAll(this.filters);
2017-01-11 23:07:03 +01:00
for (SubLogFilter filter : filters)
try {
2017-08-15 11:58:48 +02:00
allow = (filter.log(level, msg) && allow);
2017-01-11 23:07:03 +01:00
} catch (Throwable e) {
new InvocationTargetException(e, "Exception while running SubLogger Event").printStackTrace();
2016-12-29 08:29:22 +01:00
}
2017-01-11 23:07:03 +01:00
// Log to CONSOLE
2017-08-15 11:58:48 +02:00
if (allow) ProxyServer.getInstance().getLogger().log(level, name + " > " + msg);
2017-01-11 23:07:03 +01:00
// Log to MEMORY
messages.add(new LogMessage(level, msg));
2017-01-07 20:06:54 +01:00
// Log to FILE
if (writer != null) {
writer.println(line);
writer.flush();
}
2016-12-05 04:21:04 +01:00
}
}
2017-01-07 20:06:54 +01:00
} catch (IOException e) {} finally {
if (isErr) {
err = null;
} else {
out = null;
}
destroy();
}
}
@Override
2017-01-07 20:06:54 +01:00
public void stop() {
if (out != null) out.interrupt();
if (err != null) err.interrupt();
destroy();
2016-12-29 08:29:22 +01:00
}
@Override
public void registerFilter(SubLogFilter filter) {
if (Util.isNull(filter)) throw new NullPointerException();
filters.add(filter);
}
@Override
public void unregisterFilter(SubLogFilter filter) {
if (Util.isNull(filter)) throw new NullPointerException();
filters.remove(filter);
}
2017-01-07 20:06:54 +01:00
private void destroy() {
2016-12-29 08:29:22 +01:00
if (started) {
started = false;
List<SubLogFilter> filters = new ArrayList<SubLogFilter>();
filters.addAll(this.filters);
2017-01-11 23:07:03 +01:00
for (SubLogFilter filter : filters) try {
filter.stop();
} catch (Throwable e) {
new InvocationTargetException(e, "Exception while running SubLogger Event").printStackTrace();
}
messages.clear();
2016-12-05 04:21:04 +01:00
if (writer != null) {
PrintWriter writer = this.writer;
this.writer = null;
2017-01-07 20:06:54 +01:00
int l = (int) Math.floor((("---------- LOG START \u2014 " + name + " ----------").length() - 9) / 2);
String s = "";
while (s.length() < l) s += '-';
writer.println(s + " LOG END " + s);
2016-12-05 04:21:04 +01:00
writer.close();
}
}
}
@Override
2017-01-11 23:07:03 +01:00
public Object getHandler() {
return handle;
}
@Override
public String getName() {
return name;
}
@Override
public boolean isLogging() {
return log.get();
}
2017-01-11 23:07:03 +01:00
@Override
2017-01-21 17:49:37 +01:00
public List<LogMessage> getMessageHistory() {
2017-01-11 23:07:03 +01:00
return new LinkedList<LogMessage>(messages);
}
2016-12-05 04:21:04 +01:00
}