You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by ch...@apache.org on 2016/02/10 06:52:44 UTC
svn commit: r1729531 - in /sling/trunk/contrib/extensions/tracer/src:
main/java/org/apache/sling/tracer/internal/
test/java/org/apache/sling/tracer/internal/
Author: chetanm
Date: Wed Feb 10 05:52:44 2016
New Revision: 1729531
URL: http://svn.apache.org/viewvc?rev=1729531&view=rev
Log:
SLING-5459 - Recording of tracer logs
Handle logs separately in recorded json
Modified:
sling/trunk/contrib/extensions/tracer/src/main/java/org/apache/sling/tracer/internal/JSONRecording.java
sling/trunk/contrib/extensions/tracer/src/main/java/org/apache/sling/tracer/internal/TracerContext.java
sling/trunk/contrib/extensions/tracer/src/test/java/org/apache/sling/tracer/internal/JSONRecordingTest.java
sling/trunk/contrib/extensions/tracer/src/test/java/org/apache/sling/tracer/internal/LogTracerTest.java
Modified: sling/trunk/contrib/extensions/tracer/src/main/java/org/apache/sling/tracer/internal/JSONRecording.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/tracer/src/main/java/org/apache/sling/tracer/internal/JSONRecording.java?rev=1729531&r1=1729530&r2=1729531&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/tracer/src/main/java/org/apache/sling/tracer/internal/JSONRecording.java (original)
+++ sling/trunk/contrib/extensions/tracer/src/main/java/org/apache/sling/tracer/internal/JSONRecording.java Wed Feb 10 05:52:44 2016
@@ -20,6 +20,7 @@
package org.apache.sling.tracer.internal;
import java.io.IOException;
+import java.io.PrintWriter;
import java.io.StringWriter;
import java.io.Writer;
import java.util.ArrayList;
@@ -35,12 +36,14 @@ import org.apache.sling.commons.json.io.
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.slf4j.helpers.FormattingTuple;
+import org.slf4j.helpers.MessageFormatter;
class JSONRecording implements Recording {
private static final Logger log = LoggerFactory.getLogger(JSONRecording.class);
private final String method;
private final String requestId;
private final List<String> queries = new ArrayList<String>();
+ private final List<LogEntry> logs = new ArrayList<LogEntry>();
private RequestProgressTracker tracker;
private String json;
@@ -66,6 +69,7 @@ class JSONRecording implements Recording
&& params != null && params.length == 2) {
queries.add((String) params[1]);
}
+ logs.add(new LogEntry(level, logger, tuple));
}
@Override
@@ -83,6 +87,7 @@ class JSONRecording implements Recording
//not occupy memory
tracker = null;
queries.clear();
+ logs.clear();
}
} catch (JSONException e) {
log.warn("Error occurred while converting the log data for request {} to JSON", requestId, e);
@@ -113,7 +118,72 @@ class JSONRecording implements Recording
jw.value(q);
}
jw.endArray();
+
+ addJson(jw, "logs", logs);
jw.endObject();
return sw.toString();
}
+
+ private void addJson(JSONWriter jw, String name, List<? extends JsonEntry> entries) throws JSONException {
+ jw.key(name);
+ jw.array();
+ for (JsonEntry je : entries) {
+ jw.object();
+ je.toJson(jw);
+ jw.endObject();
+ }
+ jw.endArray();
+ }
+
+ private interface JsonEntry {
+ void toJson(JSONWriter jw) throws JSONException;
+ }
+
+ private static class LogEntry implements JsonEntry {
+ final Level level;
+ final String logger;
+ final FormattingTuple tuple;
+
+ private LogEntry(Level level, String logger, FormattingTuple tuple) {
+ this.level = level != null ? level : Level.INFO;
+ this.logger = logger;
+ this.tuple = tuple;
+ }
+
+ private static String toString(Object o) {
+ //Make use of Slf4j null safe toString support!
+ return MessageFormatter.format("{}", o).getMessage();
+ }
+
+ private static String getStackTraceAsString(Throwable throwable) {
+ StringWriter stringWriter = new StringWriter();
+ throwable.printStackTrace(new PrintWriter(stringWriter));
+ return stringWriter.toString();
+ }
+
+ @Override
+ public void toJson(JSONWriter jw) throws JSONException {
+ jw.key("level").value(level.levelStr);
+ jw.key("logger").value(logger);
+ jw.key("message").value(tuple.getMessage());
+
+ Object[] params = tuple.getArgArray();
+ if (params != null) {
+ jw.key("params");
+ jw.array();
+ for (Object o : params) {
+ jw.value(toString(o));
+ }
+ jw.endArray();
+ }
+
+ Throwable t = tuple.getThrowable();
+ if (t != null) {
+ //Later we can look into using Logback Throwable handling
+ jw.key("exception").value(getStackTraceAsString(t));
+
+ }
+ }
+ }
+
}
Modified: sling/trunk/contrib/extensions/tracer/src/main/java/org/apache/sling/tracer/internal/TracerContext.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/tracer/src/main/java/org/apache/sling/tracer/internal/TracerContext.java?rev=1729531&r1=1729530&r2=1729531&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/tracer/src/main/java/org/apache/sling/tracer/internal/TracerContext.java (original)
+++ sling/trunk/contrib/extensions/tracer/src/main/java/org/apache/sling/tracer/internal/TracerContext.java Wed Feb 10 05:52:44 2016
@@ -82,11 +82,13 @@ class TracerContext {
}
public boolean log(Level level, String logger, String format, Object[] params) {
- FormattingTuple tuple;
-
+ FormattingTuple tuple = null;
if (QUERY_LOGGER.equals(logger)
&& params != null && params.length == 2) {
- tuple = logQuery((String) params[1]);
+ if (logQuery((String) params[1])){
+ //Get original log message
+ tuple = logWithLoggerName(logger, format, params);
+ }
} else {
tuple = logWithLoggerName(logger, format, params);
}
@@ -132,12 +134,12 @@ class TracerContext {
return tuple;
}
- private FormattingTuple logQuery(String query) {
+ private boolean logQuery(String query) {
if (ignorableQuery(query)) {
- return null;
+ return false;
}
queryCount++;
- return logWithLoggerName("JCR", " Query {}", query);
+ return true;
}
private boolean ignorableQuery(String msg) {
Modified: sling/trunk/contrib/extensions/tracer/src/test/java/org/apache/sling/tracer/internal/JSONRecordingTest.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/tracer/src/test/java/org/apache/sling/tracer/internal/JSONRecordingTest.java?rev=1729531&r1=1729530&r2=1729531&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/tracer/src/test/java/org/apache/sling/tracer/internal/JSONRecordingTest.java (original)
+++ sling/trunk/contrib/extensions/tracer/src/test/java/org/apache/sling/tracer/internal/JSONRecordingTest.java Wed Feb 10 05:52:44 2016
@@ -26,9 +26,12 @@ import javax.servlet.http.HttpServletReq
import ch.qos.logback.classic.Level;
import org.apache.sling.commons.json.JSONObject;
import org.junit.Test;
+import org.slf4j.helpers.FormattingTuple;
import org.slf4j.helpers.MessageFormatter;
import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
@@ -67,4 +70,31 @@ public class JSONRecordingTest {
assertEquals(2, json.getJSONArray("requestProgressLogs").length());
}
+ @Test
+ public void logs() throws Exception{
+ StringWriter sw = new StringWriter();
+ JSONRecording r = new JSONRecording("abc", request);
+
+ FormattingTuple tp1 = MessageFormatter.arrayFormat("{} is going", new Object[]{"Jack"});
+ r.log(Level.INFO, "foo", tp1);
+ r.log(Level.WARN, "foo.bar", MessageFormatter.arrayFormat("Jill is going", null));
+ r.log(Level.ERROR, "foo.bar",
+ MessageFormatter.arrayFormat("Jack and {} is going", new Object[]{"Jill" , new Exception()}));
+
+ r.done();
+ r.render(sw);
+
+ JSONObject json = new JSONObject(sw.toString());
+ assertEquals(3, json.getJSONArray("logs").length());
+
+ JSONObject l1 = json.getJSONArray("logs").getJSONObject(0);
+ assertEquals("INFO", l1.getString("level"));
+ assertEquals("foo", l1.getString("logger"));
+ assertEquals(tp1.getMessage(), l1.getString("message"));
+ assertEquals(1, l1.getJSONArray("params").length());
+ assertFalse(l1.has("exception"));
+
+ JSONObject l3 = json.getJSONArray("logs").getJSONObject(2);
+ assertNotNull(l3.get("exception"));
+ }
}
Modified: sling/trunk/contrib/extensions/tracer/src/test/java/org/apache/sling/tracer/internal/LogTracerTest.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/tracer/src/test/java/org/apache/sling/tracer/internal/LogTracerTest.java?rev=1729531&r1=1729530&r2=1729531&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/tracer/src/test/java/org/apache/sling/tracer/internal/LogTracerTest.java (original)
+++ sling/trunk/contrib/extensions/tracer/src/test/java/org/apache/sling/tracer/internal/LogTracerTest.java Wed Feb 10 05:52:44 2016
@@ -264,6 +264,46 @@ public class LogTracerTest {
assertEquals(2, json.getJSONArray("requestProgressLogs").length());
}
+ @Test
+ public void recordingWithTracing() throws Exception{
+ activateTracerAndServlet();
+ MockSlingHttpServletRequest request = new MockSlingHttpServletRequest(){
+ @Override
+ public RequestProgressTracker getRequestProgressTracker() {
+ return createTracker("x", "y");
+ }
+ };
+ request.setHeader(TracerLogServlet.HEADER_TRACER_RECORDING, "true");
+ request.setHeader(LogTracer.HEADER_TRACER_CONFIG, "a.b.c;level=trace,a.b;level=debug");
+
+ HttpServletResponse response = mock(HttpServletResponse.class);
+
+ FilterChain chain = new FilterChain() {
+ @Override
+ public void doFilter(ServletRequest request, ServletResponse response)
+ throws IOException, ServletException {
+ assertNotNull(context.getService(TurboFilter.class));
+ getLogContext().addTurboFilter(context.getService(TurboFilter.class));
+ getLogger("a.b").info("a.b-info");
+ }
+ };
+
+ prepareChain(chain).doFilter(request, response);
+
+ String requestId = getRequestId(response);
+ assertNotNull(requestId);
+ Recording r = ((TracerLogServlet)context.getService(Servlet.class)).getRecording(requestId);
+ assertTrue(r instanceof JSONRecording);
+ JSONRecording jr = (JSONRecording) r;
+
+ StringWriter sw = new StringWriter();
+ jr.render(sw);
+ JSONObject json = new JSONObject(sw.toString());
+
+ assertEquals(2, json.getJSONArray("requestProgressLogs").length());
+ assertEquals(1, json.getJSONArray("logs").length());
+ }
+
private void activateTracer() {
context.registerInjectActivateService(new LogTracer(),