/
SysoutCatcher.java
129 lines (104 loc) · 5.91 KB
/
SysoutCatcher.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
package net.draycia.sysoutcatcher;
import java.util.logging.Handler;
import java.util.logging.LogRecord;
import org.bukkit.Bukkit;
import org.bukkit.event.Listener;
import org.bukkit.plugin.java.JavaPlugin;
import java.io.PrintStream;
public final class SysoutCatcher extends JavaPlugin implements Listener {
public SysoutCatcher() {
// Listen to System.out.println
PrintStream wrappedOut = new PrintStream(System.out) {
@Override
public void println(String line) {
// Get the current stack trace and the calling method (index 2)
StackTraceElement element = Thread.currentThread().getStackTrace()[2];
try {
// Get the class name at that index and the JavaPlugin that "owns" it
Class<?> clazz = Class.forName(element.getClassName());
JavaPlugin plugin = JavaPlugin.getProvidingPlugin(clazz);
StringBuilder messageBuilder = new StringBuilder();
// Optional information that may be added to the logged line
if (getConfig().getBoolean("IncludeSourceClass", false)) {
messageBuilder.append('(').append(element.getClassName()).append(") ");
}
if (getConfig().getBoolean("IncludeSourceLine", false)) {
messageBuilder.append('(').append(new Exception().getStackTrace()[2].getLineNumber()).append(") ");
}
messageBuilder.append(line);
// Instead of just printing the message, send it to the plugin's logger
plugin.getLogger().info(messageBuilder.toString());
} catch (ClassNotFoundException | IllegalArgumentException e) {
// If anything happens, the calling class doesn't exist, there is no JavaPlugin that "owns" the calling class, etc
// Just print out normally, with some added information
getLogger().info(String.format("(%s:%d) %s\n", element.getClassName(), element.getLineNumber(), line));
}
}
};
// Listen to System.err.println
PrintStream wrappedErr = new PrintStream(System.err) {
@Override
public void println(String line) {
// Get the current stack trace and the calling method (index 2)
StackTraceElement element = Thread.currentThread().getStackTrace()[2];
try {
// Get the class name at that index and the JavaPlugin that "owns" it
Class<?> clazz = Class.forName(element.getClassName());
JavaPlugin plugin = JavaPlugin.getProvidingPlugin(clazz);
StringBuilder messageBuilder = new StringBuilder();
// Optional information that may be added to the logged line
if (getConfig().getBoolean("IncludeSourceClass", false)) {
messageBuilder.append('(').append(element.getClassName()).append(") ");
}
if (getConfig().getBoolean("IncludeSourceLine", false)) {
messageBuilder.append('(').append(new Exception().getStackTrace()[2].getLineNumber()).append(") ");
}
messageBuilder.append(line);
// Instead of just printing the message, send it to the plugin's logger
plugin.getLogger().severe(messageBuilder.toString());
} catch (ClassNotFoundException | IllegalArgumentException e) {
// If anything happens, the calling class doesn't exist, there is no JavaPlugin that "owns" the calling class, etc
// Just print out normally, with some added information
getLogger().severe(String.format("(%s:%d) %s\n", element.getClassName(), element.getLineNumber(), line));
}
}
};
// Set the two PrintStreams so they're used
System.setOut(wrappedOut);
System.setErr(wrappedErr);
Bukkit.getLogger().setUseParentHandlers(false);
Bukkit.getLogger().addHandler(new Handler() {
@Override
public void publish(LogRecord record) {
if (record == null) return;
try {
// Get the class name at that index and the JavaPlugin that "owns" it
Class<?> clazz = Class.forName(record.getSourceClassName());
JavaPlugin plugin = JavaPlugin.getProvidingPlugin(clazz);
StringBuilder messageBuilder = new StringBuilder();
// Optional information that may be added to the logged line
if (getConfig().getBoolean("IncludeSourceClass", false)) {
messageBuilder.append('(').append(record.getSourceClassName()).append(") ");
}
if (getConfig().getBoolean("IncludeSourceLine", false)) {
messageBuilder.append('(').append(new Exception().getStackTrace()[2].getLineNumber()).append(") ");
}
messageBuilder.append(record.getMessage());
// Instead of just printing the message, send it to the plugin's logger
plugin.getLogger().log(record.getLevel(), messageBuilder.toString());
} catch (ClassNotFoundException | IllegalArgumentException e) {
// If anything happens, the calling class doesn't exist, there is no JavaPlugin that "owns" the calling class, etc
getLogger().log(record);
}
}
@Override
public void flush() { }
@Override
public void close() throws SecurityException { }
});
}
@Override
public void onEnable() {
this.saveDefaultConfig();
}
}