7
7
import java .io .InputStream ;
8
8
import java .io .InputStreamReader ;
9
9
import java .io .PrintWriter ;
10
+ import java .util .Enumeration ;
11
+ import java .util .HashMap ;
12
+ import java .util .Map ;
10
13
11
14
import javax .servlet .ServletConfig ;
12
15
import javax .servlet .ServletException ;
16
19
17
20
import ch .qos .logback .classic .Logger ;
18
21
import ch .qos .logback .classic .LoggerContext ;
19
- import ch .qos .logback .classic .html .HTMLLayout ;
20
22
import ch .qos .logback .classic .spi .ILoggingEvent ;
21
- import ch .qos .logback .core .html .CssBuilder ;
22
23
import org .slf4j .LoggerFactory ;
23
24
24
25
@@ -70,9 +71,9 @@ public void init (final ServletConfig configuration)
70
71
EventViewer .htmlHeadResourceParameterName , htmlHeadResourceName )));
71
72
} else
72
73
htmlHeadStream = EventViewer .class .getClassLoader ().getResourceAsStream (EventViewer .defaultHtmlHeadResource );
73
- final StringBuffer htmlHead ;
74
+ final StringBuilder htmlHead ;
74
75
if (htmlHeadStream != null ) {
75
- htmlHead = new StringBuffer ();
76
+ htmlHead = new StringBuilder ();
76
77
final BufferedReader cssReader = new BufferedReader (new InputStreamReader (htmlHeadStream ));
77
78
final char [] buffer = new char [1024 ];
78
79
while (true ) {
@@ -98,25 +99,23 @@ public void init (final ServletConfig configuration)
98
99
99
100
this .appender = (EventViewerAppender ) appender ;
100
101
101
- this .layout = new HTMLLayout ();
102
+ this .layout = new EventViewerLayout ();
102
103
this .layout .setContext (context );
103
104
if (eventPattern != null )
104
105
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
- }
113
106
this .layout .start ();
114
107
108
+ if (htmlHead != null )
109
+ this .htmlHead = htmlHead .toString ();
110
+
115
111
new Thread () {
116
- public void run () {
112
+ public void run ()
113
+ {
117
114
final Logger logger = (Logger ) LoggerFactory .getLogger (this .getClass ().getName ());
118
115
int index = 0 ;
119
116
while (true ) {
117
+ if (index % 5 == 0 )
118
+ logger .error (Integer .toString (index ), new Throwable (new Throwable ()));
120
119
logger .info (Integer .toString (index ));
121
120
index ++;
122
121
try {
@@ -132,27 +131,121 @@ public void run () {
132
131
protected void doGet (final HttpServletRequest request , final HttpServletResponse response )
133
132
throws IOException
134
133
{
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 );
135
164
synchronized (this .appender .monitor ) {
136
165
this .appender .drainEvents ();
137
- response .setHeader ("Content-Type" , "text/html" );
138
- final PrintWriter stream = response .getWriter ();
139
- stream .write (this .layout .getFileHeader ());
140
166
stream .write (this .layout .getPresentationHeader ());
167
+ stream .write (this .layout .doHeaderLayout ());
141
168
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 ));
143
171
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\" />" );
146
185
}
147
186
}
148
187
149
188
private EventViewerAppender appender ;
150
- private HTMLLayout layout ;
189
+ private String htmlHead ;
190
+ private EventViewerLayout layout ;
151
191
private Logger rootLogger ;
152
192
153
193
public static final String appenderParameterName = "appender" ;
154
- public static final String htmlHeadResourceParameterName = "html-head-resource" ;
155
194
public static final String defaultHtmlHeadResource = "logback-event-viewer.html-head" ;
156
195
public static final String eventPatternParameterName = "event-pattern" ;
196
+ public static final String htmlHeadResourceParameterName = "html-head-resource" ;
157
197
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
+ }
158
251
}
0 commit comments