Dúvida em Servlet

2 respostas
J

Tenho uma servlet que chama um outro objeto e neste objeto ele faz um log com Log4j, sendo que a cada requisição feita no log ele grava mais de uma vez.

Por exemplo fiz uma chamada a servlet, logo depois de reiniciar o tomcat, e foi gravado no log 1x só.
Na segunda a chamada a mesma servlet, foi gravado no log 2 vezes a mesma linha.

Alguém saberia o que podeira estar acotencendo?

2 Respostas

M

Você poderia ser mais preciso, exemplo, mostrando as partes dos código envolvidos?

J

Tenho uma servlete que chama um objeto. que abre um arquivo e grava dados nele, e este mesmo objeto gera um log també. Abaixo estão os códigos da servlet e do ojeto.

Servlet

package servlet;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Properties;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import control.Catcher;

public class MainServlet extends HttpServlet {

        public static Properties PROPERTIES = null;

        public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
                if(MainServlet.PROPERTIES == null){
                        MainServlet.PROPERTIES = new Properties();
                        MainServlet.PROPERTIES.load(new FileInputStream(new File("conf.properties")));
                }
                ControlFile.PATH_TXT = MainServlet.PROPERTIES.getProperty("PATH_TXT");
                ControlFile.PATH_LOG = MainServlet.PROPERTIES.getProperty("PATH_LOG");
                ControlFile.LAYOUT_LOG = MainServlet.PROPERTIES.getProperty("LAYOUT_LOG");
                ControlFile.PREFIX_FILE_LOG = MainServlet.PROPERTIES.getProperty("PREFIX_FILE_LOG");
                ControlFile controlFile = new ControlFile(request.getRemoteAddr(), request.getQueryString());
                controlFile.saveMoQueueInDisk();
                response.setContentType("text/html");
                PrintWriter out = response.getWriter();
                out.println("<html>");
                out.println("<body>");
                out.println("<p>REQUEST SUCESS</p>");
                out.println("&lt;/body&gt;");
                out.println("&lt;/html&gt;");
        }
}

Objeto que abre e grava em um arquivo:

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;

import org.apache.log4j.BasicConfigurator;
import org.apache.log4j.FileAppender;
import org.apache.log4j.Level;
import org.apache.log4j.Logger;
import org.apache.log4j.PatternLayout;

import util.BrazilCalendar;

public class ControlFile {

        private String query;
        private String ip;
        private File file;
        private BrazilCalendar brazilCalendar;
        private String token;
        private static final Logger LOGGER = Logger.getLogger(ControlFile.class);
        private static String FILE_NAME_MO = null;
        private static FileAppender FILE_APPENDER_LOG = null;
        private static File FILE = null;
        private static BufferedWriter WRITER_FILE = null;
        private static FileOutputStream OUT_FOR_FILE = null;
        //public static FileOutputStream CONNECTION_FILE = null;
        public static String PATH_TXT = "./txt/";
        public static String PATH_LOG = "./logs/";
        public static String LAYOUT_LOG = "%d{yyyy-M-dd HH:mm:ss} [%t] %p %c %x - %m%n";
        public static String PREFIX_FILE_LOG = "catcher";

        public ControlFile(){
                super();
                this.token = "[" + new BrazilCalendar().getFullDateForSystemWithHour("").replace(" ", "").replace(":", "") + Math.random() +  "]";
                BasicConfigurator.configure();
                PatternLayout patternLayout = new PatternLayout(Catcher.LAYOUT_LOG);
                Catcher.LOGGER.setLevel(Level.INFO);
                try {
                        this.brazilCalendar = new BrazilCalendar();
                        if(Catcher.FILE_APPENDER_LOG == null){
                                ControlFile.FILE_APPENDER_LOG = new FileAppender(patternLayout, Catcher.PATH_LOG + Catcher.PREFIX_FILE_LOG + this.brazilCalendar.getFullDateForSystem("") + ".log");
                        }
                        ConrolFile.LOGGER.addAppender(ControlFile.FILE_APPENDER_LOG);
                        ControlFile.LOGGER.debug(this.token + "TIME START: " + this.brazilCalendar.getFullDateForSystemWithHour("-"));
                } catch (IOException e) {
                        Catcher.LOGGER.error("CANNOT OPEN FILE LOG");
                        Catcher.LOGGER.error(e.getMessage());
                }
        }

        public ControlFile(String query){
                this();
                this.setQuery(query);
        }

        public ControlFile(String ip, String query){
                this(query);
                this.setIp(ip);
        }

        /**
         * @return the query
         */
        public String getQuery() {
                return query;
        }

        /**
         * @param query the query to set
         */
        public void setQuery(String query) {
                this.query = query;
                ControlFile.LOGGER.info("SET QUERY: " + this.query);
        }

        /**
         * @return the ip
         */
        public String getIp() {
                return ip;
        }

        /**
         * @param ip the ip to set
         */
        public void setIp(String ip) {
                this.ip = ip;
                ControlFile.LOGGER.info("SET PLEXIP: " + this.ip);
        }

        public void saveMoQueueInDisk(){
                BrazilCalendar brazilCalendar = new BrazilCalendar();
                String fileName = "moqueue" + brazilCalendar.getFullDateForSystem("") + ".txt";
                if(ControlFile.FILE_NAME_MO == null && ControlFile.FILE_NAME_MO != fileName){
                        ControlFile.FILE_NAME_MO = fileName;
                        ControlFile.FILE = new File(ControlFile.PATH_TXT + ControlFile.FILE_NAME_MO);
                }
                if(!ControlFile.FILE.exists()){
                        try {
                                ControlFile.FILE.createNewFile();
                                ControlFile.LOGGER.info(this.token + "FILE CREATED");
                        } catch (IOException e) {
                                ControlFile.LOGGER.error(this.token + "CANNOT CREATE FILE");
                        }
                }
                try {
                        if(ControlFile.OUT_FOR_FILE == null){
                                Catcher.OUT_FOR_FILE = new FileOutputStream(Catcher.FILE, true);
                        }
                        ControlFile.LOGGER.info(this.token + " FILE OPEN: " + Catcher.OUT_FOR_FILE.toString());
                        String forFile = brazilCalendar.getFullDateForSystemWithHour("-") + " " + this.ip + " " + this.query + "\n";
                        ControlFile.OUT_FOR_FILE.write(forFile.getBytes());
                        ControlFile.LOGGER.info(this.token + " DATA SAVED");
                        //ControlFile.OUT_FOR_FILE.close();
                } catch (FileNotFoundException e) {
                        ControlFile.LOGGER.error(this.token + " MESSAGE: " + e.getMessage());
                        ControlFile.LOGGER.error(this.token + " CAUSE: " + e.getCause());
                } catch (IOException e) {
                        ControlFile.LOGGER.error(this.token + " MESSAGE: " + e.getMessage());
                        ControlFile.LOGGER.error(this.token + " CAUSE: " + e.getCause());
                } finally{
                        ControlFileLOGGER.debug(this.token + "END TIME: " + this.brazilCalendar.getFullDateForSystemWithHour("-"));
                }
        }
}

Aonde tem ControlFile.LOGGER.info ou ControlFile.LOGGER.debug sempre grava 2 ou mais linhas iguais no log.
E aproveitando no ControlFile eu usu java.io para gravar dados em um arquivo, qual seria melhor o java.nio.BufferWriter?
E eu recebi alguns erros no tomcat assim too many open file(file.log) e acabei colocando o appender um atributo static, essa é a melhor solução ou teria alguma outra melhor?
Desde já agradeço a ajuda de todos.

Criado 4 de março de 2008
Ultima resposta 5 de mar. de 2008
Respostas 2
Participantes 2