Skip to content

Commit 3f2ff54

Browse files
Completely rewritten a custom HTMLLayout class.
1 parent 7cd582e commit 3f2ff54

File tree

4 files changed

+388
-24
lines changed

4 files changed

+388
-24
lines changed

logback-amqp-consumer-webapp/src/main/webapp/WEB-INF/web.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818

1919
<servlet-mapping>
2020
<servlet-name>event-viewer</servlet-name>
21-
<url-pattern>/</url-pattern>
21+
<url-pattern>/*</url-pattern>
2222
</servlet-mapping>
2323

2424
</web-app>

logback-webapp-lib/src/main/java/ch/qos/logback/webapp/EventViewer.java

Lines changed: 115 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,9 @@
77
import java.io.InputStream;
88
import java.io.InputStreamReader;
99
import java.io.PrintWriter;
10+
import java.util.Enumeration;
11+
import java.util.HashMap;
12+
import java.util.Map;
1013

1114
import javax.servlet.ServletConfig;
1215
import javax.servlet.ServletException;
@@ -16,9 +19,7 @@
1619

1720
import ch.qos.logback.classic.Logger;
1821
import ch.qos.logback.classic.LoggerContext;
19-
import ch.qos.logback.classic.html.HTMLLayout;
2022
import ch.qos.logback.classic.spi.ILoggingEvent;
21-
import ch.qos.logback.core.html.CssBuilder;
2223
import org.slf4j.LoggerFactory;
2324

2425

@@ -70,9 +71,9 @@ public void init (final ServletConfig configuration)
7071
EventViewer.htmlHeadResourceParameterName, htmlHeadResourceName)));
7172
} else
7273
htmlHeadStream = EventViewer.class.getClassLoader ().getResourceAsStream (EventViewer.defaultHtmlHeadResource);
73-
final StringBuffer htmlHead;
74+
final StringBuilder htmlHead;
7475
if (htmlHeadStream != null) {
75-
htmlHead = new StringBuffer ();
76+
htmlHead = new StringBuilder ();
7677
final BufferedReader cssReader = new BufferedReader (new InputStreamReader (htmlHeadStream));
7778
final char[] buffer = new char[1024];
7879
while (true) {
@@ -98,25 +99,23 @@ public void init (final ServletConfig configuration)
9899

99100
this.appender = (EventViewerAppender) appender;
100101

101-
this.layout = new HTMLLayout ();
102+
this.layout = new EventViewerLayout ();
102103
this.layout.setContext (context);
103104
if (eventPattern != null)
104105
this.layout.setPattern (eventPattern);
105-
if (htmlHead != null) {
106-
this.layout.setCssBuilder (new CssBuilder () {
107-
public void addCss (final StringBuilder sink)
108-
{
109-
sink.append (htmlHead);
110-
}
111-
});
112-
}
113106
this.layout.start ();
114107

108+
if (htmlHead != null)
109+
this.htmlHead = htmlHead.toString ();
110+
115111
new Thread () {
116-
public void run () {
112+
public void run ()
113+
{
117114
final Logger logger = (Logger) LoggerFactory.getLogger (this.getClass ().getName ());
118115
int index = 0;
119116
while (true) {
117+
if (index % 5 == 0)
118+
logger.error (Integer.toString (index), new Throwable (new Throwable ()));
120119
logger.info (Integer.toString (index));
121120
index++;
122121
try {
@@ -132,27 +131,121 @@ public void run () {
132131
protected void doGet (final HttpServletRequest request, final HttpServletResponse response)
133132
throws IOException
134133
{
134+
response.setHeader ("Content-Type", "text/html");
135+
final PrintWriter stream = response.getWriter ();
136+
stream.write ("<html>\n");
137+
stream.write ("<head>\n");
138+
if (this.htmlHead != null)
139+
stream.write (this.htmlHead);
140+
stream.write ("</head>\n");
141+
stream.write ("<body>\n");
142+
final String path = request.getPathInfo ();
143+
if ((path == null) || path.equals ("/"))
144+
this.doGetMain (request, response);
145+
else if (path.equals ("/event-log"))
146+
this.doGetEventLog (request, response);
147+
else
148+
this.doGetError (request, response);
149+
stream.write ("</body>\n");
150+
stream.write ("</html>\n");
151+
stream.close ();
152+
153+
}
154+
155+
protected void doGetError (final HttpServletRequest request, final HttpServletResponse response)
156+
throws IOException
157+
{}
158+
159+
protected void doGetEventLog (final HttpServletRequest request, final HttpServletResponse response)
160+
throws IOException
161+
{
162+
final PrintWriter stream = response.getWriter ();
163+
final EventFilter filter = new EventFilter (request);
135164
synchronized (this.appender.monitor) {
136165
this.appender.drainEvents ();
137-
response.setHeader ("Content-Type", "text/html");
138-
final PrintWriter stream = response.getWriter ();
139-
stream.write (this.layout.getFileHeader ());
140166
stream.write (this.layout.getPresentationHeader ());
167+
stream.write (this.layout.doHeaderLayout ());
141168
for (final ILoggingEvent event : this.appender.getEvents ())
142-
stream.write (this.layout.doLayout (event));
169+
if (filter.accepts (event))
170+
stream.write (this.layout.doLayout (event));
143171
stream.write (this.layout.getPresentationFooter ());
144-
stream.write (this.layout.getFileFooter ());
145-
stream.close ();
172+
}
173+
}
174+
175+
protected void doGetMain (final HttpServletRequest request, final HttpServletResponse response)
176+
throws IOException
177+
{
178+
final PrintWriter stream = response.getWriter ();
179+
stream.write ("<iframe class=\"EventLog\" src=\"./event-log");
180+
final String query = request.getQueryString ();
181+
if (query != null) {
182+
stream.write ("?");
183+
stream.write (query);
184+
stream.write ("\" frameborder=\"0\" scrolling=\"auto\" />");
146185
}
147186
}
148187

149188
private EventViewerAppender appender;
150-
private HTMLLayout layout;
189+
private String htmlHead;
190+
private EventViewerLayout layout;
151191
private Logger rootLogger;
152192

153193
public static final String appenderParameterName = "appender";
154-
public static final String htmlHeadResourceParameterName = "html-head-resource";
155194
public static final String defaultHtmlHeadResource = "logback-event-viewer.html-head";
156195
public static final String eventPatternParameterName = "event-pattern";
196+
public static final String htmlHeadResourceParameterName = "html-head-resource";
157197
private static final long serialVersionUID = 1L;
198+
199+
protected static class EventFilter
200+
{
201+
public EventFilter (final HttpServletRequest request)
202+
{
203+
super ();
204+
this.levelValue = request.getParameter ("level");
205+
this.mdcValues = null;
206+
final Enumeration<String> parameterNames = request.getParameterNames ();
207+
while (parameterNames.hasMoreElements ()) {
208+
final String parameterName = parameterNames.nextElement ();
209+
if (!parameterName.startsWith ("mdc."))
210+
continue;
211+
final String mdcKey = parameterName.substring ("mdc.".length ());
212+
if (this.mdcValues == null)
213+
this.mdcValues = new HashMap<String, String> ();
214+
this.mdcValues.put (mdcKey, request.getParameter (parameterName));
215+
}
216+
final String mdcStrictValues = request.getParameter ("mdc_strict");
217+
if ((mdcStrictValues != null) && ("true".equals (mdcStrictValues)))
218+
this.mdcStrictValues = true;
219+
else
220+
this.mdcStrictValues = false;
221+
}
222+
223+
public boolean accepts (final ILoggingEvent event)
224+
{
225+
if ((this.levelValue != null) && !this.levelValue.equals (event.getLevel ().levelStr))
226+
return (false);
227+
if (this.mdcValues != null) {
228+
final Map<String, String> eventMdcValues = event.getMdc ();
229+
if (eventMdcValues == null) {
230+
if (this.mdcStrictValues)
231+
return (false);
232+
else
233+
return (true);
234+
}
235+
for (final String mdcKey : this.mdcValues.keySet ()) {
236+
final String eventMdcValue = eventMdcValues.get (mdcKey);
237+
if (eventMdcValue == null) {
238+
if (this.mdcStrictValues)
239+
return (false);
240+
} else if (!eventMdcValue.equals (this.mdcValues.get (mdcKey)))
241+
return (false);
242+
}
243+
}
244+
return (true);
245+
}
246+
247+
protected String levelValue;
248+
protected boolean mdcStrictValues;
249+
protected Map<String, String> mdcValues;
250+
}
158251
}

0 commit comments

Comments
 (0)