Merge pull request 'Improved error and crash reporting' (#208) from improvedErrorReporting into master
Alle Prüfungen waren erfolgreich
SteamWarCI Build successful
Alle Prüfungen waren erfolgreich
SteamWarCI Build successful
Reviewed-on: #208 Reviewed-by: Chaoscaot <chaoscaot@zohomail.eu>
Dieser Commit ist enthalten in:
Commit
982779607f
@ -104,7 +104,6 @@ public class Core extends JavaPlugin{
|
|||||||
public void onEnable() {
|
public void onEnable() {
|
||||||
setSqlConfig();
|
setSqlConfig();
|
||||||
errorHandler = new ErrorHandler();
|
errorHandler = new ErrorHandler();
|
||||||
if(VERSION > 15)
|
|
||||||
crashDetector = new CrashDetector();
|
crashDetector = new CrashDetector();
|
||||||
|
|
||||||
SWCommandUtils.init((SWTypeMapperCreator<TypeMapper<Object>, CommandSender, Object>) (mapper, tabCompleter) -> new TypeMapper<Object>() {
|
SWCommandUtils.init((SWTypeMapperCreator<TypeMapper<Object>, CommandSender, Object>) (mapper, tabCompleter) -> new TypeMapper<Object>() {
|
||||||
@ -142,7 +141,6 @@ public class Core extends JavaPlugin{
|
|||||||
@Override
|
@Override
|
||||||
public void onDisable() {
|
public void onDisable() {
|
||||||
TinyProtocol.instance.close();
|
TinyProtocol.instance.close();
|
||||||
if(VERSION > 15)
|
|
||||||
crashDetector.stop();
|
crashDetector.stop();
|
||||||
errorHandler.unregister();
|
errorHandler.unregister();
|
||||||
if(!standalone) {
|
if(!standalone) {
|
||||||
|
@ -51,7 +51,7 @@ public class CrashDetector {
|
|||||||
while (run) {
|
while (run) {
|
||||||
long curTime = System.currentTimeMillis();
|
long curTime = System.currentTimeMillis();
|
||||||
if(curTime - TIMEOUT > lastTick.get()) {
|
if(curTime - TIMEOUT > lastTick.get()) {
|
||||||
SWException.log(Bukkit.getServer().getVersion() + " server hung for " + (curTime - lastTick.get()) + "ms, ", Arrays.stream(mainThread.getStackTrace()).map(StackTraceElement::toString).collect(Collectors.joining("\n")));
|
SWException.log("Server hung for " + (curTime - lastTick.get()) + "ms", Arrays.stream(mainThread.getStackTrace()).map(StackTraceElement::toString).collect(Collectors.joining("\n")));
|
||||||
lastTick.set(curTime);
|
lastTick.set(curTime);
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
|
@ -19,6 +19,7 @@
|
|||||||
|
|
||||||
package de.steamwar.core;
|
package de.steamwar.core;
|
||||||
|
|
||||||
|
import com.comphenix.tinyprotocol.Reflection;
|
||||||
import de.steamwar.sql.SWException;
|
import de.steamwar.sql.SWException;
|
||||||
import de.steamwar.sql.Statement;
|
import de.steamwar.sql.Statement;
|
||||||
|
|
||||||
@ -34,10 +35,15 @@ import java.util.logging.Logger;
|
|||||||
|
|
||||||
public class ErrorHandler extends Handler {
|
public class ErrorHandler extends Handler {
|
||||||
|
|
||||||
private boolean logDisabled = false;
|
private final long watchdogThreadId;
|
||||||
|
|
||||||
public ErrorHandler(){
|
public ErrorHandler(){
|
||||||
Logger.getLogger("").addHandler(this);
|
Logger.getLogger("").addHandler(this);
|
||||||
|
|
||||||
|
Class<?> watchdogThread = Reflection.getClass("org.spigotmc.WatchdogThread");
|
||||||
|
Reflection.FieldAccessor<?> getInstance = Reflection.getField(watchdogThread, watchdogThread, 0);
|
||||||
|
Thread watchdog = (Thread) getInstance.get(null);
|
||||||
|
watchdogThreadId = watchdog.getId();
|
||||||
}
|
}
|
||||||
|
|
||||||
void unregister() {
|
void unregister() {
|
||||||
@ -45,16 +51,15 @@ public class ErrorHandler extends Handler {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
public void publish(LogRecord logRecord) {
|
public void publish(LogRecord logRecord) {
|
||||||
if(logRecord.getLevel().intValue() < Level.WARNING.intValue())
|
if(logRecord.getLevel().intValue() < Level.WARNING.intValue())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if(logDisabled)
|
if(watchdogThreadId == logRecord.getThreadID())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
String message = logRecord.getMessage();
|
String message = logRecord.getMessage() != null ? logRecord.getMessage() : "";
|
||||||
if(message == null)
|
|
||||||
message = "";
|
|
||||||
for(String reason : ignoreStartsWith)
|
for(String reason : ignoreStartsWith)
|
||||||
if(message.startsWith(reason))
|
if(message.startsWith(reason))
|
||||||
return;
|
return;
|
||||||
@ -62,20 +67,6 @@ public class ErrorHandler extends Handler {
|
|||||||
if(message.contains(reason))
|
if(message.contains(reason))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
switch (message) {
|
|
||||||
case "The server has stopped responding!":
|
|
||||||
logDisabled = true;
|
|
||||||
return;
|
|
||||||
case "------------------------------":
|
|
||||||
message = "Server stopped responding";
|
|
||||||
logDisabled = true;
|
|
||||||
break;
|
|
||||||
case "Exception stopping the server":
|
|
||||||
logDisabled = true;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
}
|
|
||||||
|
|
||||||
ByteArrayOutputStream stacktraceOutput = new ByteArrayOutputStream();
|
ByteArrayOutputStream stacktraceOutput = new ByteArrayOutputStream();
|
||||||
if(logRecord.getThrown() != null)
|
if(logRecord.getThrown() != null)
|
||||||
logRecord.getThrown().printStackTrace(new PrintStream(stacktraceOutput));
|
logRecord.getThrown().printStackTrace(new PrintStream(stacktraceOutput));
|
||||||
|
@ -20,22 +20,28 @@
|
|||||||
package de.steamwar.sql;
|
package de.steamwar.sql;
|
||||||
|
|
||||||
import org.bukkit.Bukkit;
|
import org.bukkit.Bukkit;
|
||||||
|
import org.bukkit.World;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
|
||||||
public class SWException {
|
public class SWException {
|
||||||
private SWException(){}
|
private SWException(){}
|
||||||
|
|
||||||
|
private static final String serverVersion = Bukkit.getServer().getVersion();
|
||||||
|
private static final String cwd = System.getProperty("user.dir");
|
||||||
|
private static final String server = new File(".").getAbsoluteFile().getName();
|
||||||
|
|
||||||
public static void log(String message, String stacktrace){
|
public static void log(String message, String stacktrace){
|
||||||
message += "\n";
|
StringBuilder msgBuilder = new StringBuilder(message).append("\nPlayers: ");
|
||||||
for(Player player : Bukkit.getOnlinePlayers())
|
for(Player player : Bukkit.getOnlinePlayers())
|
||||||
message += player.getName() + " ";
|
msgBuilder.append(player.getName()).append(" ");
|
||||||
|
msgBuilder.append("\nWorlds: ");
|
||||||
|
for(World world : Bukkit.getWorlds())
|
||||||
|
msgBuilder.append(world.getName()).append(" ");
|
||||||
|
msgBuilder.append("\nServer: ").append(serverVersion);
|
||||||
|
msgBuilder.append("\nCWD: ").append(cwd);
|
||||||
|
|
||||||
String server;
|
Provider.impl.logException(server, msgBuilder.toString(), stacktrace);
|
||||||
if(Bukkit.getWorlds().isEmpty())
|
|
||||||
server = Bukkit.getName();
|
|
||||||
else
|
|
||||||
server = Bukkit.getWorlds().get(0).getName();
|
|
||||||
|
|
||||||
Provider.impl.logException(server, message, stacktrace);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
In neuem Issue referenzieren
Einen Benutzer sperren