Author: chetanm Date: Mon Jul 27 06:01:13 2015 New Revision: 1692812 URL: http://svn.apache.org/r1692812 Log: SLING-4905 - Log WebConsole Plugin should provide link to actual log file
Modified: sling/trunk/bundles/commons/log/src/main/java/org/apache/sling/commons/log/logback/internal/SlingConfigurationPrinter.java sling/trunk/bundles/commons/log/src/main/java/org/apache/sling/commons/log/logback/internal/SlingLogPanel.java sling/trunk/bundles/commons/log/src/main/java/org/apache/sling/commons/log/logback/internal/Tailer.java Modified: sling/trunk/bundles/commons/log/src/main/java/org/apache/sling/commons/log/logback/internal/SlingConfigurationPrinter.java URL: http://svn.apache.org/viewvc/sling/trunk/bundles/commons/log/src/main/java/org/apache/sling/commons/log/logback/internal/SlingConfigurationPrinter.java?rev=1692812&r1=1692811&r2=1692812&view=diff ============================================================================== --- sling/trunk/bundles/commons/log/src/main/java/org/apache/sling/commons/log/logback/internal/SlingConfigurationPrinter.java (original) +++ sling/trunk/bundles/commons/log/src/main/java/org/apache/sling/commons/log/logback/internal/SlingConfigurationPrinter.java Mon Jul 27 06:01:13 2015 @@ -62,7 +62,7 @@ public class SlingConfigurationPrinter { LogbackManager.LoggerStateContext ctx = logbackManager.determineLoggerState(); int numOfLines = getNumOfLines(); - Tailer tailer = new Tailer(new PrinterListener(printWriter), numOfLines); + Tailer tailer = new Tailer(printWriter, numOfLines); dumpLogFileSummary(printWriter, ctx.getAllAppenders()); @@ -93,7 +93,7 @@ public class SlingConfigurationPrinter { dumpLogbackStatus(logbackManager, printWriter); } - private static void includeWholeFile(PrintWriter printWriter, File file) { + static void includeWholeFile(PrintWriter printWriter, File file) { FileReader fr = null; try { fr = new FileReader(file); @@ -297,18 +297,4 @@ public class SlingConfigurationPrinter { } return SDF.format(modified); } - - private static class PrinterListener implements Tailer.TailerListener { - private final PrintWriter pw; - - public PrinterListener(PrintWriter pw) { - this.pw = pw; - } - - @Override - public void handle(String line) { - pw.println(line); - } - } - } Modified: sling/trunk/bundles/commons/log/src/main/java/org/apache/sling/commons/log/logback/internal/SlingLogPanel.java URL: http://svn.apache.org/viewvc/sling/trunk/bundles/commons/log/src/main/java/org/apache/sling/commons/log/logback/internal/SlingLogPanel.java?rev=1692812&r1=1692811&r2=1692812&view=diff ============================================================================== --- sling/trunk/bundles/commons/log/src/main/java/org/apache/sling/commons/log/logback/internal/SlingLogPanel.java (original) +++ sling/trunk/bundles/commons/log/src/main/java/org/apache/sling/commons/log/logback/internal/SlingLogPanel.java Mon Jul 27 06:01:13 2015 @@ -27,8 +27,11 @@ import java.io.FileInputStream; import java.io.IOException; import java.io.PrintWriter; import java.io.StringWriter; +import java.io.UnsupportedEncodingException; import java.net.URL; import java.net.URLConnection; +import java.net.URLDecoder; +import java.net.URLEncoder; import java.util.Collection; import java.util.Dictionary; import java.util.Hashtable; @@ -78,6 +81,11 @@ public class SlingLogPanel extends HttpS private static final long serialVersionUID = 1L; + /** + * Request param name to control number of lines to include in the log + */ + private static final String PARAM_NUM_OF_LINES = "tail"; + private final CachingDateFormatter SDF = new CachingDateFormatter("yyyy-MM-dd HH:mm:ss"); private static final String[] LEVEL_NAMES = { @@ -114,8 +122,18 @@ public class SlingLogPanel extends HttpS final PrintWriter pw = resp.getWriter(); final String consoleAppRoot = (String) req.getAttribute("felix.webconsole.appRoot"); + final String root = (String) req.getAttribute("felix.webconsole.pluginRoot"); final LoggerStateContext ctx = logbackManager.determineLoggerState(); + if (root != null) { + String pathInfo = req.getRequestURI().substring(root.length()); + if (pathInfo.length() > 0){ + String appenderName = URLDecoder.decode(pathInfo.substring(1), "utf-8"); + renderAppenderContent(ctx, pw, appenderName, getNumOfLines(req)); + return; + } + } + appendLoggerStatus(pw, ctx); appendOsgiConfiguredLoggerData(pw, consoleAppRoot); appendOtherLoggerData(pw, ctx); @@ -279,7 +297,7 @@ public class SlingLogPanel extends HttpS pw.println("</div>"); } - private void appendOtherLoggerData(final PrintWriter pw, final LoggerStateContext ctx) { + private void appendOtherLoggerData(final PrintWriter pw, final LoggerStateContext ctx) throws UnsupportedEncodingException { if (ctx.nonOSgiConfiguredLoggers.isEmpty()) { return; } @@ -309,7 +327,7 @@ public class SlingLogPanel extends HttpS pw.print(Boolean.toString(logger.isAdditive())); pw.println("</td>"); pw.print("<td>"); - pw.print( XmlUtil.escapeXml(logger.getName())); + pw.print(XmlUtil.escapeXml(logger.getName())); pw.println("</td>"); pw.println("<td>"); @@ -331,7 +349,7 @@ public class SlingLogPanel extends HttpS pw.println("</div>"); } - private void addAppenderData(final PrintWriter pw, final String consoleAppRoot, final LoggerStateContext ctx) { + private void addAppenderData(final PrintWriter pw, final String consoleAppRoot, final LoggerStateContext ctx) throws UnsupportedEncodingException { pw.println("<div class='table'>"); pw.println("<div class='ui-widget-header ui-corner-top buttonGroup'>Appender</div>"); @@ -351,7 +369,11 @@ public class SlingLogPanel extends HttpS for (final Appender<ILoggingEvent> appender : ctx.appenders.values()) { pw.println("<tr>"); pw.print("<td>"); - pw.print(XmlUtil.escapeXml(getName(appender))); + if (appender instanceof FileAppender) { + pw.print(getLinkedName((FileAppender<ILoggingEvent>) appender)); + } else { + pw.print(XmlUtil.escapeXml(getName(appender))); + } pw.println("</td>"); pw.print("<td>"); pw.print(formatPid(consoleAppRoot, appender, ctx)); @@ -581,6 +603,41 @@ public class SlingLogPanel extends HttpS return true; } + private void renderAppenderContent(LoggerStateContext ctx, PrintWriter pw, String appenderName, int numOfLines) + throws IOException { + for (final Appender<ILoggingEvent> appender : ctx.appenders.values()) { + if (appender instanceof FileAppender && appenderName.equals(appender.getName())) { + final File file = new File(((FileAppender) appender).getFile()); + if (file.exists()) { + if (numOfLines < 0) { + SlingConfigurationPrinter.includeWholeFile(pw, file); + } else { + new Tailer(pw, numOfLines).tail(file); + } + } + return; + } + } + pw.printf("No appender with name [%s] found", appenderName); + } + + private int getNumOfLines(HttpServletRequest req) { + return Util.toInteger(req.getParameter(PARAM_NUM_OF_LINES), logbackManager.getLogConfigManager().getNumOfLines()); + } + + private String getLinkedName(FileAppender<ILoggingEvent> appender) throws UnsupportedEncodingException { + String fileName = appender.getFile(); + String name = appender.getName(); + return String.format("File : [<a href=\"%s/%s?%s=%d\">%s</a>] %s", + APP_ROOT, + URLEncoder.encode(name, "UTF-8"), + PARAM_NUM_OF_LINES, + logbackManager.getLogConfigManager().getNumOfLines(), + XmlUtil.escapeXml(name), + XmlUtil.escapeXml(fileName)); + + } + /** * Configures the logger with the given pid. If the pid is empty a new logger configuration is created. * @@ -708,7 +765,7 @@ public class SlingLogPanel extends HttpS } } - private static String getName(Appender<ILoggingEvent> appender) { + private static String getName(Appender<ILoggingEvent> appender) throws UnsupportedEncodingException { // For normal file appender we also display the name of appender if (appender instanceof FileAppender) { return String.format("File : [%s] %s", appender.getName(), ((FileAppender) appender).getFile()); Modified: sling/trunk/bundles/commons/log/src/main/java/org/apache/sling/commons/log/logback/internal/Tailer.java URL: http://svn.apache.org/viewvc/sling/trunk/bundles/commons/log/src/main/java/org/apache/sling/commons/log/logback/internal/Tailer.java?rev=1692812&r1=1692811&r2=1692812&view=diff ============================================================================== --- sling/trunk/bundles/commons/log/src/main/java/org/apache/sling/commons/log/logback/internal/Tailer.java (original) +++ sling/trunk/bundles/commons/log/src/main/java/org/apache/sling/commons/log/logback/internal/Tailer.java Mon Jul 27 06:01:13 2015 @@ -21,6 +21,7 @@ package org.apache.sling.commons.log.log import java.io.File; import java.io.IOException; +import java.io.PrintWriter; import java.io.RandomAccessFile; class Tailer{ @@ -29,6 +30,10 @@ class Tailer{ private final TailerListener listener; private final byte[] buffer = new byte[BUFFER_SIZE]; + public Tailer(PrintWriter printWriter, int numOfLines) { + this(new PrinterListener(printWriter), numOfLines); + } + public Tailer(TailerListener listener, int numOfLines) { this.listener = listener; this.numOfLines = numOfLines; @@ -148,4 +153,17 @@ class Tailer{ } } + private static class PrinterListener implements Tailer.TailerListener { + private final PrintWriter pw; + + public PrinterListener(PrintWriter pw) { + this.pw = pw; + } + + @Override + public void handle(String line) { + pw.println(line); + } + } + }