Pregunta

Estoy planeando implementar el inicio de sesión en una aplicación web en la que estoy trabajando actualmente, pero tengo problemas con algunos de los detalles.¿Cuál es la mejor manera de iniciar sesión en una aplicación web Java?

Específicamente;

  • ¿Dónde va el archivo de configuración en el archivo del paquete .war?
  • ¿Dónde inician sesión las personas, un archivo plano de ruta relativa o absoluta o una base de datos?
  • ¿El registro de Log4J va directamente al archivo de registro del servidor de aplicaciones de forma automática o es algo que debe configurar?En este caso estoy usando Tomcat, pero suelo usar Jrun.
  • ¿Algún otro problema que deba tener en cuenta para el registro de aplicaciones web?

Actualmente estoy usando Log4J pero imagino que las mejores prácticas se aplicarían universalmente a todas las implementaciones de registro.

EDITAR:
Una adición a las preguntas anteriores.

  • ¿Dónde inicia la configuración de registro?

En una aplicación tradicional, hago esto en el punto de entrada;

DOMConfigurator.configureAndWatch("log4j.xml");

¿Cuál sería el equivalente de la aplicación web?

¿Fue útil?

Solución

Coloco mi configuración en el paquete predeterminado: src /

e inicie sesión en los archivos utilizando la propiedad del sistema $ {catalina.home}:

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

Otros consejos

Recomiendo que use SLF4J . Esta es una fachada de registro simple que admite la mayoría de los sistemas de registro populares ( Log4j , commons-logging , Java Logging API y Logback ). Utilizándolo, podrá reemplazar su sistema de registro de subrayado por cualquier otro, mediante una simple actualización de CLASSPATH.

El otro beneficio de SLF4J son llamadas parametrizadas , lo que reduce el código de registro feo.

En realidad, recomiendan usar SLF4J con Logback . Logback es un sucesor de Log4J . Y fue diseñado por el mismo autor.

¿Dónde va el archivo de configuración en el archivo de paquete .war? Raíz del classpath.

¿Dónde inician sesión las personas, un archivo plano de ruta relativa o absoluta o una base de datos? Depende de la necesidad. Siempre es mejor usar rutas relativas. Las bases de datos son buenas si implementa otra aplicación que extraerá registros de él y los enviará por correo electrónico / sms

¿El registro de Log4J va directamente al archivo de registro del servidor de aplicaciones automáticamente o es algo que debe configurar? En este caso estoy usando Tomcat, pero a menudo uso Jrun. Si usa el apéndice de la consola, sí, se registrará en el archivo de registro del contenedor de servlet.

¿Algún otro problema que debo tener en cuenta para el registro de aplicaciones web? Si está iniciando sesión desde diferentes subprocesos, use logback , es seguro para subprocesos y expone mensajes de registro parametrizados.

Iniciar sesión en una base de datos agrega otro punto de falla. Tuvimos una situación en la que los servidores de productos registraron un DB y alguien realizó una consulta costosa en ese DB que lo desaceleró tanto que los servidores de productos se volvieron muy, muy lentos. Iniciar sesión en un archivo puede causar problemas si se queda sin espacio, pero parece menos probable que ralentice toda la aplicación.

Puede ser una buena idea colocar el archivo de configuración en algún lugar donde un administrador pueda modificarlo sin reconstruir su aplicación web (por ejemplo, para que puedan activar el registro detallado sin despertarlo en medio de la noche).

Desafortunadamente, no hay " official " forma de localizar recursos externalizados desde una aplicación web (corrígeme si me equivoco). La forma más común de hacerlo que he visto es mirar a través de los directorios en el classpath.

Recomiendo llamar a log API (log4j) a través de slf4j. Incluso si usa log4j, el contenedor web o los módulos dependientes pueden usar diferentes API de registro, como Java.util.logging o Jakarta commons logging. Slf4j proporciona módulos puente que los redirigen a la API slf4j. Como resultado, todos los mensajes de registro son escritos por log4j en ese caso.

El excelente artículo Cómo hacer el registro correcto de la aplicación tiene un montón de trucos.

Creo que sus otras preguntas han sido respondidas por otras personas en esta página.

También te recomiendo que uses SLF4J.

Una última cosa: tener representaciones hablables de objetos puede ahorrar algo de tiempo.

  • coloque el log4j en el contenedor (servidor) y cree los apéndices adecuados por aplicación
  • en relación con la ruta del servidor, pero eso depende de sus necesidades
  • utilizamos apéndices que inician sesión en diferentes archivos, depende de sus necesidades, p. un archivo para información / estadísticas de hibernación, uno solo para aplicación, etc.
  • no inicie sesión demasiado, ralentiza la aplicación

Personalmente pongo log4j.properties en el directorio WEB-INF y uso un servlet init con el siguiente 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");
}

}

  • ¿Dónde va el archivo de configuración en el archivo de paquete .war?

En la raíz del classpath pero ... No coloque el archivo de configuración en el paquete war. No desea volver a empaquetar y volver a implementar la aplicación si cambia la configuración de registro, ¿verdad? Una mejor práctica sería colocar el archivo de configuración en algún lugar del classpath fuera de la guerra.

  • ¿Dónde se conectan las personas, un archivo plano de ruta relativa o absoluta o una base de datos?

Normalmente inicio sesión en el sistema de archivos en una partición separada (los archivos de registro pueden crecer muy rápido y nunca deberían bloquear la aplicación o el sistema operativo si se vuelven demasiado grandes). La mayor parte del tiempo uso una ruta absoluta basada en el siguiente modelo: / var / projects / & Lt; PROJECT_NAME & Gt; / & Lt; PRODUCT & Gt; / < CLUSTER_NAME > / logs / < INSTANCE_NAME > .log where < PROJECT_NAME > es el nombre del proyecto, < PRODUCT > puede ser Apache, Tomcat, Weblogic, ..., < CLUSTER_NAME > el nombre del clúster y < INSTANCE_NAME > El nombre de la instancia dentro del clúster. Iniciar sesión en el sistema de archivos es más rápido que en una base de datos. El inconveniente es que los registros no están centralizados si está utilizando varias instancias y máquinas físicas. Pero la fusión se puede hacer fácilmente con un script.

  • ¿El registro de Log4J va directamente al archivo de registro del servidor de aplicaciones automáticamente o es algo que debe configurar? En este caso estoy usando Tomcat, pero a menudo uso Jrun.

Los registros del servidor de aplicaciones son registros del servidor de aplicaciones, no registros de aplicaciones. No les escriba, sino que configure una herramienta de registro (por ejemplo, log4j) y escriba en los registros de la aplicación (entienda dedicado).

  • ¿Algún otro problema que debo tener en cuenta para el registro de aplicaciones web?

Si está utilizando log4j, no olvide usar isDebugEnabled () antes de iniciar sesión:

if(logger.isDebugEnabled()) {
  logger.debug("Bla Bla Bla");
}
  • ¿Dónde va el archivo de configuración en el archivo del paquete .war?

Por lo general, no coloco ninguna configuración de registro en la aplicación, sino que dejo que los administradores del servidor de aplicaciones configuren el registro en todo el servidor.En los raros casos en los que quiero implementar la configuración de log4j con una aplicación web, WEB-INF es la ruta habitual.

  • ¿Dónde inician sesión las personas, un archivo plano de ruta relativa o absoluta o una base de datos?

Nuevamente, depende de la configuración del servidor de aplicaciones.Un archivo de registro común para un servidor de aplicaciones y que rota diariamente es la configuración habitual.Si hay necesidades específicas de la aplicación, el administrador puede configurar un archivo de registro separado para una aplicación (distinguido por nombres de paquete/clase).

  • ¿El registro de Log4J va directamente al archivo de registro del servidor de aplicaciones de forma automática o es algo que debe configurar?En este caso estoy usando Tomcat, pero suelo usar Jrun.

Véase más arriba.Para Tomcat utilizado con fines de desarrollo, simplemente buscaría su configuración de registro (log4j) y agregaría allí una aplicación específica.

  • ¿Algún otro problema que deba tener en cuenta para el registro de aplicaciones web?Actuación.Limite el nivel de registro al mínimo (es decir,ADVERTENCIA o ERROR) una vez que entre en funcionamiento.Usarif (log.isDebugEnabled()) { log.debug("..."); } y construcciones similares en su código.

Tenga en cuenta que si solo necesita un poco de registro, el estándar de servlet especifica que puede obtener el ServletContext y utilizar los métodos de registro allí. Ese es el equivalente de servlet genérico de System.out.println.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top