/* (c) 2014 - 2016 Open Source Geospatial Foundation - all rights reserved
* (c) 2001 - 2013 OpenPlans
* 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.FileReader;
import java.util.LinkedList;
import java.util.logging.Level;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.markup.html.form.NumberTextField;
import org.apache.wicket.markup.html.form.SubmitLink;
import org.apache.wicket.markup.html.form.TextArea;
import org.apache.wicket.markup.html.link.Link;
import org.apache.wicket.model.LoadableDetachableModel;
import org.apache.wicket.model.PropertyModel;
import org.apache.wicket.request.cycle.RequestCycle;
import org.apache.wicket.request.handler.resource.ResourceStreamRequestHandler;
import org.apache.wicket.request.mapper.parameter.PageParameters;
import org.apache.wicket.request.resource.ContentDisposition;
import org.apache.wicket.util.resource.FileResourceStream;
import org.apache.wicket.util.resource.IResourceStream;
import org.apache.wicket.validation.validator.RangeValidator;
import org.geoserver.config.GeoServerDataDirectory;
import org.geoserver.logging.LoggingUtils;
import org.geoserver.platform.GeoServerExtensions;
import org.geoserver.platform.GeoServerResourceLoader;
import org.geoserver.platform.resource.Paths;
import org.geoserver.web.GeoServerSecuredPage;
/**
* Shows the log file contents
*
* @author Andrea Aime - OpenGeo
*/
public class LogPage extends GeoServerSecuredPage {
private static final long serialVersionUID = 4742103132576413211L;
static final String LINES = "lines";
int lines = 1000;
File logFile;
@SuppressWarnings("serial")
public LogPage(PageParameters params) {
@SuppressWarnings("rawtypes")
Form<?> form = new Form("form");
add(form);
/**
* take geoserver log file location from Config as absolute path and only use if valid,
* otherwise fallback to (geoserver-root)/logs/geoserver.log as default.
*/
String location = GeoServerExtensions.getProperty(LoggingUtils.GEOSERVER_LOG_LOCATION);
if(location == null) {
location= getGeoServerApplication().getGeoServer().getLogging().getLocation();
}
if (location == null) {
GeoServerResourceLoader loader = getGeoServerApplication().getResourceLoader();
logFile = loader.get("logs").get("geoserver.log").file();
location = logFile.getAbsolutePath();
} else {
logFile = new File(location);
if (!logFile.isAbsolute()) {
// locate the geoserver.log file
GeoServerDataDirectory dd = getGeoServerApplication().getBeanOfType(
GeoServerDataDirectory.class);
logFile = dd.get(Paths.convert(logFile.getPath())).file();
}
}
if (!logFile.exists()) {
error("Could not find the GeoServer log file: " + logFile.getAbsolutePath());
}
try {
if (params.getNamedKeys().contains(LINES)) {
if (params.get(LINES).toInt() > 0) {
lines = params.get(LINES).toInt();
}
}
} catch (Exception e) {
LOGGER.log(Level.WARNING, "Error parsing the lines parameter: ", params.get(LINES).toString());
}
form.add(new SubmitLink("refresh") {
@Override
public void onSubmit() {
setResponsePage(LogPage.class, new PageParameters().add(LINES, lines));
}
});
NumberTextField<Integer> lines = new NumberTextField<Integer>("lines", new PropertyModel<Integer>(this, "lines"));
lines.add(RangeValidator.minimum(1));
form.add(lines);
TextArea<String> logs = new TextArea<String>("logs", new GSLogsModel());
logs.setOutputMarkupId(true);
logs.setMarkupId("logs");
add(logs);
add(new Link<Object>("download") {
@Override
public void onClick() {
IResourceStream stream = new FileResourceStream(logFile){
public String getContentType() {
return "text/plain";
}
};
ResourceStreamRequestHandler handler = new ResourceStreamRequestHandler(stream, "geoserver.log");
handler.setContentDisposition(ContentDisposition.ATTACHMENT);
RequestCycle.get().scheduleRequestHandlerAfterCurrent(handler);
}
});
}
public class GSLogsModel extends LoadableDetachableModel<String> {
private static final long serialVersionUID = 3364442904754424569L;
@Override
protected String 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.toString();
} catch (Exception e) {
error(e);
return e.getMessage();
} finally {
if (br != null) {
try {
br.close();
} catch (Exception e) {
// ignore
}
}
}
}
}
}