Justin Deoliveira ha scritto:
Very nice indeed.Perhaps as a future enhancement we could add some sort of "download log" utility. Where the entire log is compressed and sent back to the client. Be a nice way to help users submit bug reports.
Easy peasy, here we go (updated patch and screenshot attached) Cheers Andrea -- Andrea Aime OpenGeo - http://opengeo.org Expert service straight from the developers.
<<inline: downloadLog-nq8.png>>
diff --git a/src/web/core/src/main/java/GeoServerApplication.properties b/src/web/core/src/main/java/GeoServerApplication.properties
index 9f2edfd..f7c3bc2 100644
--- a/src/web/core/src/main/java/GeoServerApplication.properties
+++ b/src/web/core/src/main/java/GeoServerApplication.properties
@@ -253,6 +253,13 @@ LayerPage.th.type = Type
LayerPage.th.workspace = Workspace
LayerPage.title = Layers
+LogPage.description = Show the GeoServer log file contents
+LogPage.title = GeoServer logs
+LogPage.refresh = Refresh
+LogPage.maxLines = Maximum console lines
+LogPage.download = Download the full log file
+
+
#MetadataLinkEditor.noMetadataLinksDefined=No metadata links defined so far
MetadataLinkEditor.addLink = Add link
MetadataLinkEditor.format = Format
diff --git a/src/web/core/src/main/java/applicationContext.xml b/src/web/core/src/main/java/applicationContext.xml
index c599b86..44a51c0 100644
--- a/src/web/core/src/main/java/applicationContext.xml
+++ b/src/web/core/src/main/java/applicationContext.xml
@@ -82,6 +82,15 @@
<property name="icon" value="../img/icons/silk/server_chart.png"/>
<property name="order" value="10"/>
</bean>
+ <bean id="logsPage" class="org.geoserver.web.MenuPageInfo">
+ <property name="id" value="server.admin.logs"/>
+ <property name="titleKey" value="LogPage.title"/>
+ <property name="descriptionKey" value="LogPage.description"/>
+ <property name="componentClass" value="org.geoserver.web.admin.LogPage"/>
+ <property name="category" ref="serverCategory"/>
+ <property name="icon" value="../img/icons/silk/page_white_text.png"/>
+ <property name="order" value="15"/>
+ </bean>
<bean id="contactMenuPage" class="org.geoserver.web.MenuPageInfo">
<property name="id" value="server.admin.contact"/>
<property name="titleKey" value="ContactPage.title"/>
@@ -109,7 +118,7 @@
<property name="icon" value="../img/icons/silk/cog_photo.png"/>
<property name="order" value="40"/>
</bean>
- <bean id="abountMenuPage" class="org.geoserver.web.MenuPageInfo">
+ <bean id="aboutMenuPage" class="org.geoserver.web.MenuPageInfo">
<property name="id" value="server.about"/>
<property name="titleKey" value="AboutGeoServerPage.title"/>
<property name="descriptionKey" value="AboutGeoServerPage.description"/>
diff --git a/src/web/core/src/main/java/org/geoserver/web/admin/LogPage.html b/src/web/core/src/main/java/org/geoserver/web/admin/LogPage.html
new file mode 100644
index 0000000..fb0cb4b
--- /dev/null
+++ b/src/web/core/src/main/java/org/geoserver/web/admin/LogPage.html
@@ -0,0 +1,22 @@
+<html xmlns:wicket="http://wicket.apache.org/">
+<wicket:head>
+ <script defer="defer" type="text/javascript">
+ var textArea = document.getElementById('logs');
+ textArea.scrollTop = textArea.scrollHeight;
+ </script>
+</wicket:head>
+<body>
+<wicket:extend>
+ <div style="width:95%">
+ <form wicket:id="form">
+ <div style="float:right"><a href="#" wicket:id="refresh"><wicket:message key="refresh">refresh</wicket:message></a></div>
+ <div style="float:left"><wicket:message key="maxLines">max console lines</wicket:message> <input type="text" wicket:id="lines"/></div>
+ </form>
+ <div><textarea readonly="readonly" style="width:100%;height:50em;font-size:small" wicket:id="logs"></textarea></div>
+ <a href="#" wicket:id="download"><wicket:message key="download">download full log file</wicket:message></a>
+ </div>
+
+
+</wicket:extend>
+</body>
+</html>
diff --git a/src/web/core/src/main/java/org/geoserver/web/admin/LogPage.java b/src/web/core/src/main/java/org/geoserver/web/admin/LogPage.java
new file mode 100644
index 0000000..e2c4a6f
--- /dev/null
+++ b/src/web/core/src/main/java/org/geoserver/web/admin/LogPage.java
@@ -0,0 +1,164 @@
+/* Copyright (c) 2001 - 2008 TOPP - www.openplans.org. All rights reserved.
+ * This code is licensed under the GPL 2.0 license, available at the root
+ * application directory.
+ */
+package org.geoserver.web.admin;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.LinkedList;
+import java.util.logging.Level;
+
+import org.apache.wicket.IRequestTarget;
+import org.apache.wicket.PageParameters;
+import org.apache.wicket.RequestCycle;
+import org.apache.wicket.markup.html.form.Form;
+import org.apache.wicket.markup.html.form.SubmitLink;
+import org.apache.wicket.markup.html.form.TextArea;
+import org.apache.wicket.markup.html.form.TextField;
+import org.apache.wicket.markup.html.link.Link;
+import org.apache.wicket.model.LoadableDetachableModel;
+import org.apache.wicket.model.PropertyModel;
+import org.apache.wicket.protocol.http.WebResponse;
+import org.apache.wicket.util.io.Streams;
+import org.apache.wicket.validation.validator.NumberValidator;
+import org.geoserver.config.GeoServerDataDirectory;
+import org.geoserver.web.GeoServerSecuredPage;
+
+/**
+ * Shows the log file contents
+ *
+ * @author Andrea Aime - OpenGeo
+ */
+public class LogPage extends GeoServerSecuredPage {
+ static final String LINES = "lines";
+
+ int lines = 1000;
+
+ File logFile;
+
+ public LogPage(PageParameters params) {
+ Form form = new Form("form");
+ add(form);
+
+ // locate the geoserver.log file
+ GeoServerDataDirectory dd = getGeoServerApplication().getBeanOfType(
+ GeoServerDataDirectory.class);
+ File logDirectory = new File(dd.root(), "logs");
+ if (!logDirectory.exists()) {
+ error("Could not find the logs directory inside the data dir: "
+ + logDirectory.getAbsolutePath());
+ }
+ logFile = new File(logDirectory, "geoserver.log");
+ if (!logFile.exists()) {
+ error("Could not find the GeoServer log file: " + logFile.getAbsolutePath());
+ }
+
+ try {
+ if (params.getKey(LINES) != null) {
+ if (params.getInt(LINES) > 0) {
+ lines = params.getInt(LINES);
+ }
+ }
+ } catch (Exception e) {
+ LOGGER.log(Level.WARNING, "Error parsing the lines parameter: ", params.getKey(LINES));
+ }
+
+ form.add(new SubmitLink("refresh") {
+ @Override
+ public void onSubmit() {
+ setResponsePage(LogPage.class, new PageParameters(LINES + "="
+ + String.valueOf(lines)));
+ }
+ });
+
+ TextField lines = new TextField("lines", new PropertyModel(this, "lines"));
+ lines.add(NumberValidator.POSITIVE);
+ form.add(lines);
+
+ TextArea logs = new TextArea("logs", new GSLogsModel());
+ logs.setOutputMarkupId(true);
+ logs.setMarkupId("logs");
+ add(logs);
+
+ add(new Link("download") {
+
+ @Override
+ public void onClick() {
+ RequestCycle.get().setRequestTarget(new IRequestTarget() {
+
+ public void detach(RequestCycle requestCycle) {
+ }
+
+ public void respond(RequestCycle requestCycle) {
+
+ InputStream is = null;
+ try {
+ is = new FileInputStream(logFile);
+
+ WebResponse r = (WebResponse) requestCycle.getResponse();
+ r.setAttachmentHeader("geoserver.log");
+ r.setContentType("text/plain");
+ Streams.copy(is, r.getOutputStream());
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ } finally {
+ if(is != null) {
+ try {
+ is.close();
+ } catch (IOException e) {
+ }
+ }
+ }
+ }
+
+ });
+
+ }
+ });
+
+ }
+
+ public class GSLogsModel extends LoadableDetachableModel {
+
+ @Override
+ protected Object load() {
+ BufferedReader br = null;
+ try {
+ // load the logs line by line, keep only the last 1000 lines
+ LinkedList<String> lineList = new LinkedList<String>();
+
+ br = new BufferedReader(new FileReader(logFile));
+ String line;
+ while ((line = br.readLine()) != null) {
+ lineList.addLast(line);
+ if (lineList.size() > LogPage.this.lines) {
+ lineList.removeFirst();
+ }
+ }
+
+ StringBuilder result = new StringBuilder();
+ for (String logLine : lineList) {
+ result.append(logLine).append("\n");
+ }
+ return result;
+ } catch (Exception e) {
+ error(e);
+ return e.getMessage();
+ } finally {
+ if (br != null) {
+ try {
+ br.close();
+ } catch (Exception e) {
+ // ignore
+ }
+ }
+ }
+ }
+
+ }
+}
diff --git a/src/web/core/src/main/java/org/geoserver/web/img/icons/silk/page_white_text.png b/src/web/core/src/main/java/org/geoserver/web/img/icons/silk/page_white_text.png
new file mode 100644
index 0000000..813f712
Binary files /dev/null and b/src/web/core/src/main/java/org/geoserver/web/img/icons/silk/page_white_text.png differ
------------------------------------------------------------------------------ ThinkGeek and WIRED's GeekDad team up for the Ultimate GeekDad Father's Day Giveaway. ONE MASSIVE PRIZE to the lucky parental unit. See the prize list and enter to win: http://p.sf.net/sfu/thinkgeek-promo
_______________________________________________ Geoserver-devel mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/geoserver-devel
