/* 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.MinimumValidator; import org.geoserver.config.GeoServerDataDirectory; import org.geoserver.logging.LoggingUtils; import org.geoserver.platform.GeoServerExtensions; 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); /** * 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(); } logFile = new File(location); if (!logFile.isAbsolute()) { // locate the geoserver.log file GeoServerDataDirectory dd = getGeoServerApplication().getBeanOfType( GeoServerDataDirectory.class); logFile = new File(dd.root(), logFile.getPath()); } 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(new MinimumValidator(1)); 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 } } } } } }