Pergunta

Estou planejando implementar o login em um aplicativo da Web no qual estou trabalhando atualmente, mas estou lutando com alguns detalhes.Qual é a melhor maneira de registrar um aplicativo da web Java?

Especificamente;

  • Para onde vai o arquivo de configuração no arquivo do pacote .war?
  • Onde as pessoas fazem login, arquivo simples de caminho relativo ou absoluto ou banco de dados?
  • O log do Log4J vai diretamente para o arquivo de log do servidor de aplicativos automaticamente ou é algo que você precisa configurar?Neste caso estou usando o Tomcat, mas costumo usar o Jrun.
  • Alguma outra dica que eu deveria estar ciente para o log de aplicativos da web?

Atualmente estou usando o Log4J, mas imagino que as práticas recomendadas se aplicariam universalmente a todas as implementações de registro.

EDITAR:
Uma adição às perguntas acima.

  • Onde você inicia a configuração do log?

Em um aplicativo tradicional, faço isso no ponto de entrada;

DOMConfigurator.configureAndWatch("log4j.xml");

Qual seria o equivalente do aplicativo da web?

Foi útil?

Solução

Coloco minha configuração no pacote padrão: SRC/

e faça login nos arquivos usando a propriedade $ {catalina.home} Sistema:

log4j.appender.???.file=${catalina.home}/logs/system.log

Outras dicas

Eu recomendaria que você use Slf4j. Esta é uma fachada simples de registro que suporta a maioria dos sistemas populares de madeira (Log4j, Loging de Commons, API de log de java e Logback). Usando isso, Você poderá substituir seu sistema de registro sublinhado Para qualquer outro, por atualização simples de classe de classe.

O outro benefício de Slf4j são chamadas parametrizadas, o que reduz o código de registro feia.

Na verdade, eles recomendam usar Slf4j com Logback. Logback é um sucessor de Log4j. E foi projetado pelo mesmo autor.

Onde o arquivo de configuração entra no .war Package File?Raiz do caminho de classe.

Para onde as pessoas fazem login, arquivo plano relativo ou absoluto ou um banco de dados?Depende da necessidade. É sempre melhor usar caminhos relativos. Os bancos de dados são bons se você implementar outro aplicativo que buscará logs e enviá -los usando email/sms

O log4J do log4J vai diretamente para o arquivo de log do servidor de aplicativos automaticamente ou é algo que você precisa configurar? Nesse caso, estou usando o Tomcat, mas costumo usar o JRUN.Se você usar o Appender do Console, sim, ele será registrado no arquivo de log do seu servlet.

Algum outro gotchas que eu deveria estar ciente para o log de aplicativos da web?Se você estiver registrando de diferentes fios, use Logback, é seguro para threads e expõe mensagens de log parametrizadas.

O registro em um banco de dados adiciona outro ponto de falha. Tivemos uma situação em que os servidores Prod registrados em um banco de dados e alguém executou uma consulta cara naquele banco de dados que a diminuiu tanto que os servidores de produtos produtivos ficaram muito, muito lentos. O registro em um arquivo pode causar problemas se você ficar sem espaço, mas parece menos provável que diminua o aplicativo inteiro.

Pode ser uma boa idéia colocar o arquivo de configuração em algum lugar onde um administrador possa modificá -lo sem reconstruir seu aplicativo da web (por exemplo, para que eles possam ativar o log detalhado sem acordá -lo no meio da noite).

Infelizmente, não existe uma maneira "oficial" para localizar recursos externos de um aplicativo da web (corrija -me se estiver errado). A maneira mais comum de fazê -lo que eu vi é examinar os diretórios no caminho de classe.

Eu recomendo ligar para a API de log (log4j) via SLF4J. Mesmo se você usar o LOG4J, o contêiner da Web ou os módulos dependendo poderá usar diferentes API de log, como java.util.logging ou o log do Jakarta Commons. O SLF4J fornece módulos de ponte que os redirecionam para a API SLF4J. Como resultado, todas as mensagens de log são gravadas por log4j nesse caso.

O excelente papel Como fazer o registro de aplicativos corretamente tem um monte de pegadinhas.

Acredito que suas outras perguntas foram respondidas por outras pessoas nesta página.

Também recomendo que você use SLF4J.

Uma última coisa:tendo representações faladas de objetos pode economizar algum tempo.

  • Coloque o log4j no contêiner (servidor) e crie apêndices adequados por aplicativo
  • em relação ao caminho do servidor, mas isso depende de suas necessidades
  • Usamos os apêndeiros que registram arquivos diferentes, depende de suas necessidades, por exemplo, um arquivo para hibernate informações/estatísticas, apenas para aplicativos etc.
  • Não registre muito, diminui o aplicativo

Pessoalmente, coloquei os Log4j.properties no diretório da Web-Inf e uso um servlet init com o seguinte código:

public class InitServlet extends javax.servlet.http.HttpServlet implements javax.servlet.Servlet {

private static final String LOG4J_FILE = "WEB-INF/log4j.properties";

public InitServlet() {
    super();
}

@Override
public void init() throws ServletException {
    super.init();
    PropertyConfigurator.configure(getServletContext().getRealPath(LOG4J_FILE));
    LogFactory.getLog(InitServlet.class).info("LOG 4J configured");
}

}

  • Onde o arquivo de configuração entra no .war Package File?

Na raiz do caminho de classe, mas ... não coloque o arquivo de configuração no pacote de guerra. Você não deseja reembalar e reimplementar o aplicativo se alterar a configuração de log, não é? Uma prática melhor seria colocar o arquivo de configuração em algum lugar no caminho de classe fora da guerra.

  • Para onde as pessoas fazem login, arquivo plano relativo ou absoluto ou um banco de dados?

Eu costumo fazer login no sistema de arquivos em um partição separada (Os arquivos de log podem crescer muito rapidamente e nunca devem bloquear o aplicativo ou o sistema operacional se se tornarem muito grandes). Eu uso a maior parte do tempo e um caminho absoluto com base no seguinte modelo:/var/Projects/u003CPROJECT_NAME> /u003CPRODUCT> /u003CCLUSTER_NAME> /Histórico/u003CINSTANCE_NAME> .Log whereu003CPROJECT_NAME> é o nome do projeto,u003CPRODUCT> pode ser apache, tomcat, weblogic, ...,u003CCLUSTER_NAME> o nome do cluster eu003CINSTANCE_NAME> o nome da instância dentro do cluster. O log no sistema de arquivos é mais rápido que em um banco de dados. A desvantagem é que os logs não são centralizados se você estiver usando várias instâncias e máquinas físicas. Mas a fusão pode ser facilmente feita com um script.

  • O log4J do log4J vai diretamente para o arquivo de log do servidor de aplicativos automaticamente ou é algo que você precisa configurar? Nesse caso, estou usando o Tomcat, mas costumo usar o JRUN.

Os logs do servidor de aplicativos são logs do servidor de aplicativos, não logs de aplicativos. Não escreva para eles, mas configure uma ferramenta de logger (por exemplo, log4j) e escreva os logs do aplicativo (compreenda dedicados).

  • Algum outro gotchas que eu deveria estar ciente para o log de aplicativos da web?

Se você estiver usando o log4j, não se esqueça de usar o isdebugenabled () antes de registrar:

if(logger.isDebugEnabled()) {
  logger.debug("Bla Bla Bla");
}
  • Onde o arquivo de configuração entra no .war Package File?

Geralmente, não coloco nenhuma configuração de registro no aplicativo, em vez de deixar isso para os administradores do AppServer para configurar o registro em todo o servidor. Nos casos raros, quero a configuração do LOG4J implantada com um WebApp, o Web-Inf é o caminho usual.

  • Para onde as pessoas fazem login, arquivo plano relativo ou absoluto ou um banco de dados?

Novamente, depende das configurações do AppServer. Um arquivo de log comum para um servidor de aplicativos e girar diariamente é a configuração usual. Se houver alguma necessidade específica do aplicativo, o administrador poderá configurar um arquivo de log separado para um aplicativo (distinguido por nomes de pacote / classe).

  • O log4J do log4J vai diretamente para o arquivo de log do servidor de aplicativos automaticamente ou é algo que você precisa configurar? Nesse caso, estou usando o Tomcat, mas costumo usar o JRUN.

Veja acima. Para o Tomcat usado para fins de desenvolvimento, eu apenas procurava sua configuração de log4j e adicionaria o aplicativo específico lá.

  • Algum outro gotchas que eu deveria estar ciente para o log de aplicativos da web? Atuação. Limite o nível de log a um mínimo (ou seja, aviso ou erro) depois que você for lançado. Usarif (log.isDebugEnabled()) { log.debug("..."); } e construções iguais em seu código.

Observe que, se você precisar apenas de um pouco de log, o padrão do servlet especifica que você pode obter o servletContext e usar os métodos de log lá. Esse é o servlet genérico equivalente a system.out.println.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top