001/**
002 * Copyright (C) 2014  Universidade de Aveiro, DETI/IEETA, Bioinformatics Group - http://bioinformatics.ua.pt/
003 *
004 * This file is part of Dicoogle/dicoogle.
005 *
006 * Dicoogle/dicoogle is free software: you can redistribute it and/or modify
007 * it under the terms of the GNU General Public License as published by
008 * the Free Software Foundation, either version 3 of the License, or
009 * (at your option) any later version.
010 *
011 * Dicoogle/dicoogle is distributed in the hope that it will be useful,
012 * but WITHOUT ANY WARRANTY; without even the implied warranty of
013 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
014 * GNU General Public License for more details.
015 *
016 * You should have received a copy of the GNU General Public License
017 * along with Dicoogle.  If not, see <http://www.gnu.org/licenses/>.
018 */
019package pt.ua.dicoogle.server.web.servlets.management;
020
021import java.io.BufferedReader;
022import java.io.FileReader;
023import java.io.IOException;
024import java.io.PrintWriter;
025import java.util.Map;
026
027import javax.servlet.ServletException;
028import javax.servlet.http.HttpServlet;
029import javax.servlet.http.HttpServletRequest;
030import javax.servlet.http.HttpServletResponse;
031import org.apache.logging.log4j.LogManager;
032import org.apache.logging.log4j.core.Appender;
033import org.apache.logging.log4j.core.appender.FileAppender;
034import org.apache.logging.log4j.core.appender.RandomAccessFileAppender;
035import org.apache.logging.log4j.core.appender.RollingFileAppender;
036import org.apache.logging.log4j.core.appender.RollingRandomAccessFileAppender;
037import org.slf4j.Logger;
038import org.slf4j.LoggerFactory;
039import pt.ua.dicoogle.sdk.Utils.Platform;
040
041/**
042 * @author Frederico Silva <fredericosilva@ua.pt>
043 * @author Eduardo Pinho <eduardopinho@ua.pt>
044 */
045public class LoggerServlet extends HttpServlet {
046    private static final Logger classLogger = LoggerFactory.getLogger(LoggerServlet.class);
047
048    private String logFilename = null;
049    
050    protected String logFilename() {
051        if (this.logFilename == null) {
052            org.apache.logging.log4j.Logger logger = LogManager.getLogger();
053            Map<String, Appender> appenderMap = ((org.apache.logging.log4j.core.Logger) logger).getAppenders();
054            for (Map.Entry<String,Appender> e : appenderMap.entrySet()) {
055                String filename = null;
056                Appender appender = e.getValue();
057                if (appender instanceof FileAppender) {
058                    filename = ((FileAppender)appender).getFileName();
059                } else if (appender instanceof RollingFileAppender) {
060                    filename = ((RollingFileAppender)appender).getFileName();
061                } else if (appender instanceof RandomAccessFileAppender) {
062                    filename = ((RandomAccessFileAppender)appender).getFileName();
063                } else if (appender instanceof RollingRandomAccessFileAppender) {
064                    filename = ((RollingRandomAccessFileAppender)appender).getFileName();
065                }
066                if (filename != null) {
067                    classLogger.debug("Using \"{}\" as the file for the server log.", filename);
068                    this.logFilename = filename;
069                    return this.logFilename;
070                }
071            }
072            // no file appender found, use default DICOMLOG.log
073            classLogger.debug("No file appender found, using \"DICOMLOG.log\" as the default logger");
074            this.logFilename = Platform.homePath() + "DICOMLOG.log";
075        }
076        return this.logFilename;
077    }
078
079        @Override
080        protected void doGet(HttpServletRequest req, HttpServletResponse resp)
081                        throws ServletException, IOException {
082                try (BufferedReader fis = new BufferedReader(new FileReader(logFilename()))) {
083            PrintWriter respWriter = resp.getWriter();
084            String l;
085            while ((l = fis.readLine()) != null) {
086                respWriter.println(l);
087            }
088        }
089        }
090}