source: ComponentRegistry/trunk/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/frontend/ViewLogPage.java @ 2757

Last change on this file since 2757 was 2757, checked in by twagoo, 11 years ago

Close log file after reading tail
[Refs #294]

File size: 3.2 KB
Line 
1package clarin.cmdi.componentregistry.frontend;
2
3import java.io.File;
4import java.io.FileNotFoundException;
5import java.io.IOException;
6import java.io.RandomAccessFile;
7import java.text.NumberFormat;
8import org.apache.log4j.FileAppender;
9import org.apache.log4j.Logger;
10import org.apache.wicket.PageParameters;
11import org.apache.wicket.markup.html.basic.Label;
12import org.apache.wicket.markup.html.form.TextArea;
13import org.apache.wicket.markup.html.link.DownloadLink;
14import org.apache.wicket.markup.html.link.Link;
15import org.apache.wicket.model.Model;
16import org.slf4j.LoggerFactory;
17
18/**
19 *
20 * @author Twan Goosen <twan.goosen@mpi.nl>
21 * @author paucas
22 */
23public class ViewLogPage extends SecureAdminWebPage {
24
25    private final static org.slf4j.Logger logger = LoggerFactory.getLogger(ViewLogPage.class);
26
27    public ViewLogPage(final PageParameters pageParameters) {
28        super(pageParameters);
29        addLinks();
30        addLogFileContent();
31    }
32
33    private void addLinks() {
34        add(new Link("home") {
35            @Override
36            public void onClick() {
37                setResponsePage(AdminHomePage.class);
38            }
39        });
40    }
41
42    private void addLogFileContent() {
43        final int tailSize = 1000000; // Megabyte
44
45        final NumberFormat numberFormat = NumberFormat.getIntegerInstance();
46        numberFormat.setGroupingUsed(true);
47
48        final File logFile = getLogFile();
49        if (logFile != null) {
50            try {
51                RandomAccessFile raLogFile = null;
52                try {
53                    raLogFile = geFileTail(logFile, tailSize);
54                    final String content = getLogFileContent(raLogFile);
55
56                    add(new Label("logLabel", String.format("Showing final %s bytes (or less) of total %s in %s:", numberFormat.format(tailSize), numberFormat.format(raLogFile.length()), logFile)));
57                    add(new TextArea("logText", new Model(content)));
58
59                    add(new DownloadLink("logDownloadLink", logFile));
60                } catch (IOException ioEx) {
61                    add(new Label("logLabel", "Could not read from log file. See error message below."));
62                    add(new TextArea("logText", new Model(ioEx.getMessage())));
63                    throw (ioEx);
64                } finally {
65                    if (raLogFile != null) {
66                        raLogFile.close();
67                    }
68                }
69            } catch (IOException ioEx) {
70                logger.error("Error in reading log file", ioEx);
71            }
72        }
73    }
74
75    private String getLogFileContent(final RandomAccessFile randomAccessFile) throws IOException {
76        String currentLine;
77        StringBuilder contentBuilder = new StringBuilder();
78        while ((currentLine = randomAccessFile.readLine()) != null) {
79            contentBuilder.append(currentLine).append("\n");
80        }
81        String content = contentBuilder.toString();
82        return content;
83    }
84
85    private RandomAccessFile geFileTail(File logFile, int tailLength) throws IOException, FileNotFoundException {
86        // Skip to tail of file
87        final RandomAccessFile raLogFile = new RandomAccessFile(logFile, "r");
88        final long startPosition = raLogFile.length() - tailLength;
89        if (startPosition > 0) {
90            raLogFile.seek(startPosition);
91            // Read until end of line so we don't end up halfway some random line
92            raLogFile.readLine();
93        }
94        return raLogFile;
95    }
96
97    private File getLogFile() {
98        // Get file from appender
99        final FileAppender appender = (FileAppender) Logger.getRootLogger().getAppender("ROOT");
100        if (appender != null) {
101            return new File(appender.getFile());
102        }
103        return null;
104    }
105}
Note: See TracBrowser for help on using the repository browser.