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
130
131
132
133
134
135
136
|
package org.openslx.dozmod.gui.helper;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Insets;
import java.io.Serializable;
import javax.swing.BorderFactory;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextPane;
import javax.swing.border.BevelBorder;
import javax.swing.border.EmptyBorder;
import javax.swing.text.BadLocationException;
import javax.swing.text.SimpleAttributeSet;
import javax.swing.text.StyleConstants;
import javax.swing.text.StyledDocument;
import org.apache.logging.log4j.Level;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.core.Appender;
import org.apache.logging.log4j.core.Core;
import org.apache.logging.log4j.core.Filter;
import org.apache.logging.log4j.core.Layout;
import org.apache.logging.log4j.core.LogEvent;
import org.apache.logging.log4j.core.LoggerContext;
import org.apache.logging.log4j.core.appender.AbstractAppender;
import org.apache.logging.log4j.core.config.Configuration;
import org.apache.logging.log4j.core.config.Property;
import org.apache.logging.log4j.core.config.plugins.Plugin;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;
import org.openslx.dozmod.gui.Gui;
@Plugin(name = "DebugAppender", category = Core.CATEGORY_NAME, elementType = Appender.ELEMENT_TYPE)
class DebugAppender extends AbstractAppender
{
private static final DateTimeFormatter formatter = DateTimeFormat.forPattern("HH:mm:ss");
private final JTextPane textPane;
protected DebugAppender(final String name, final Filter filter, final Layout<? extends Serializable> layout,
final boolean ignoreExceptions, final Property[] properties, final JTextPane textPane)
{
super(name, filter, layout, ignoreExceptions, properties);
this.textPane = textPane;
}
protected DebugAppender(final String name, final Filter filter, final JTextPane textPane)
{
this(name, filter, null, true, null, textPane);
}
@Override
public void append(LogEvent event)
{
final Level eventLevel = event.getLevel();
final Color eventColor;
if (eventLevel.isMoreSpecificThan(Level.ERROR)) {
eventColor = Color.RED;
} else if (eventLevel.isMoreSpecificThan(Level.WARN)) {
eventColor = Color.ORANGE;
} else if (eventLevel.isMoreSpecificThan(Level.INFO)) {
eventColor = Color.BLACK;
} else {
eventColor = Color.GRAY;
}
final long eventTimestamp = event.getTimeMillis();
final String eventThreadName = event.getThreadName();
final String eventLoggerName = event.getLoggerName();
final String eventMessage = event.getMessage().getFormattedMessage();
Gui.asyncExec( new Runnable() {
@Override
public void run()
{
printEvent("[" + formatter.print( eventTimestamp ) + "] ", Color.BLACK);
printEvent(eventThreadName + "@" + eventLoggerName.replaceAll("^.*\\.", ""), Color.GRAY);
printEvent(" " + eventMessage + "\n", eventColor);
}
} );
}
private void printEvent(String msg, Color c) {
StyledDocument doc = this.textPane.getStyledDocument();
SimpleAttributeSet keyWord = new SimpleAttributeSet();
StyleConstants.setForeground(keyWord, c);
try {
doc.insertString(doc.getLength(), msg, keyWord);
} catch (BadLocationException e) {
e.printStackTrace(); // Do not use LOGGER here to prevent infinite loop
}
this.textPane.setCaretPosition(doc.getLength());
}
}
public class DebugWindow extends JPanel {
/**
* Version for serialization.
*/
private static final long serialVersionUID = 2602474207529142616L;
private final JTextPane txtLog;
public DebugWindow() {
setLayout(new BorderLayout());
txtLog = new JTextPane();
txtLog.setEditable(false);
txtLog.setBackground(Color.WHITE);
txtLog.setForeground(Color.BLACK);
txtLog.setBorder(new EmptyBorder(new Insets(5, 5, 5, 5)));
JScrollPane sp = new JScrollPane(txtLog, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
sp.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED));
add(sp, BorderLayout.CENTER);
registerLogger();
validate();
}
private void registerLogger() {
final LoggerContext loggingContext = LoggerContext.class.cast(LogManager.getContext(false));
final Configuration loggingConfig = loggingContext.getConfiguration();
// add debug logging appender
final DebugAppender debugAppender = new DebugAppender("logToDebug", null, this.txtLog);
debugAppender.start();
// register debug logging appender
loggingConfig.addAppender(debugAppender);
loggingConfig.getRootLogger().addAppender(debugAppender, Level.ALL, null);
loggingContext.updateLoggers(loggingConfig);
}
}
|