2009-03-05 28 views
21

Estoy planeando implementar el registro en una aplicación web en la que estoy trabajando actualmente, pero estoy luchando con algunos de los detalles. ¿Cuál es la mejor manera de iniciar sesión en una aplicación web Java?¿Estás registrando aplicaciones web Java?

Específicamente;

  • ¿Dónde se encuentra el archivo de configuración en el archivo del paquetewar?
  • ¿Dónde se registran las personas, archivo plano de ruta relativa o absoluta, o una base de datos?
  • ¿El registro Log4J va directamente al archivo de registro del servidor de aplicaciones automáticamente o es algo que tiene que configurar? En este caso, estoy usando Tomcat, pero a menudo uso 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 de las preguntas más importantes arriba.

  • ¿Dónde se 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?

+0

Decidí finalmente aceptar una respuesta sobre esto. No es que haya una sola respuesta, pero la respuesta de cherouvim fue la más útil. –

Respuesta

4

Pongo mi configuración en el paquete por defecto: src/

y conectarse a los archivos utilizando el sistema de propiedad $ {} catalina.home:

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

Ah, estoy usando windows y catalina.home no parece estar configurado como una variable de entorno en ninguna de las máquinas en las que tengo tomcat. ¿Eso se resuelve mediante algún mecanismo interno de tomcat o simplemente tengo que configurarlo manualmente? ¿A dónde apunta catalina.home, la carpeta raíz de tomcat? –

+1

Lo siento, mi error, no es una variable env, sino una propiedad del sistema que tomcat establece cuando se inicia. – cherouvim

+0

Adelante y configúrelo manualmente. En realidad, hay 2 formas de instalar Tomcat en Windows. Uno pasa por una instalación estándar de Windows (e instala tomcat como un servicio de Windows), el otro es simplemente un viejo archivo zip. No creo que ninguno de los enfoques actualice ninguna variable de entorno para usted. – toolkit

0
  • poner el log4j en el recipiente (servidor) y crear appenders adecuados por aplicación
  • relativa a la ruta del servidor, pero eso depende de sus necesidades
  • usamos appenders que se registran en archivos diferentes, depende de su necesidades, p. un archivo de información/estadísticas de hibernación, uno para la única aplicación, etc.
  • no registrar a mucho, se ralentiza la aplicación abajo
+0

Poner la configuración de Log4j en el contenedor es una idea interesante. Sin embargo, en mi entorno de trabajo particular pude ver que creaba problemas de implementación. –

+0

este enfoque permite desacoplar aún más las necesidades de desarrollo y producción, el desarrollador tiene su propia instancia de servidor y puede registrar lo que quiera, sin el problema de registrar y desplegar "accidentalmente" el desarrollo log4j en una máquina de producción –

+0

@Michael Lange : Puede hacer lo mismo al tener diferentes artefactos de configuración para desarrollo, puesta en escena, producción. Prefiero tener log4j en mi aplicación. Tenerlo en el contenedor hace que sea imposible que más de 1 aplicación controle la configuración de registro. – cherouvim

8

dónde viene el fichero de configuración ir en el archivo .war paquete? Raíz del classpath.

¿Dónde se registran las personas, 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 recuperará registros y las 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 tiene que configurar? En este caso, estoy usando Tomcat, pero a menudo uso Jrun. Si usa el apilador de consola, sí, se registrará en el archivo de registro del contenedor de servlet.

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

+0

Tenía la impresión de que Log4J también es seguro para subprocesos. –

+0

Es: http://logging.apache.org/log4j/1.2/faq.html#1.7 –

0

Personalmente pongo el log4j.properties en el directorio WEB-INF y utilice un servlet de inicio 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"); 
} 

}

2

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

Desafortunadamente, no hay una forma "oficial" para localizar recursos externalizados desde una aplicación web (corríjame 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.

+0

Sí, he encontrado los mismos problemas con los archivos de configuración de la aplicación. Es la maldición del paquete de guerra. Por otra parte, un administrador inteligente debería ser capaz de abrir el paquete usando algo como 7-Zip y editar el archivo de configuración. Tristemente no empleamos a nadie así. –

+2

Sí, e incluso si el administrador en realidad es lo suficientemente inteligente como para hackear el archivo WAR, su configuración personalizada se anulará cuando se implemente la siguiente versión. – gustafc

0
  • ¿Dónde se encuentra el archivo de configuración en el archivo del paquetewar?

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 registran las personas, archivo plano de ruta relativa o absoluta, o una base de datos?

por lo general de registro en el sistema de archivos en una partición separada (archivos de registro pueden crecer muy rápido y nunca debería bloquear la aplicación o el sistema operativo si se vuelven demasiado grandes). Yo uso la mayor parte del tiempo, una ruta absoluta basado en el modelo siguiente:/var/proyectos/<Project_Name>/<PRODUCTO>/<CLUSTER_NAME>/logs/<INSTANCE_NAME> .log donde <PROJECT_NAME> es el nombre del proyecto, <PRODUCTO> puede ser Apache, Tomcat, Weblogic, ..., <CLUSTER_NAME> el nombre del clúster y <INSTANCE_NAME> el nombre de la instancia dentro del clúster. El inicio de 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 Log4J va directamente al archivo de registro del servidor de aplicaciones automáticamente o es algo que tiene que 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 escriba a ellos, pero configure una herramienta de registro (por ejemplo, log4j) y escriba en los registros de la aplicación (entienda dedicado).

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

Si utiliza log4j, no se olvide de utilizar el isDebugEnabled() antes de iniciar la sesión:

if(logger.isDebugEnabled()) { 
    logger.debug("Bla Bla Bla"); 
} 
0
  • dónde viene el fichero de configuración ir en el archivo .war paquete?

Normalmente, no coloco ninguna configuración de registro en la aplicación, sino que dejo eso a los administradores del servidor de aplicaciones para configurar el registro en todo el servidor. En los casos poco frecuentes en los que deseo que se despliegue la configuración de log4j con una aplicación web, WEB-INF es la ruta habitual.

  • ¿Dónde se registran las personas, 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 rotación diaria 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 (que se distingue por los nombres de paquete/clase).

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

Ver más arriba. Para Tomcat utilizado para fines de desarrollo, simplemente buscaría su configuración de registro (log4j) y agregaría específica de la aplicación específica allí.

  • ¿Algún otro problema que deba tener en cuenta para el registro de aplicaciones web? Rendimiento. Limite el nivel de registro a un mínimo (es decir, ADVERTENCIA o ERROR) una vez que se activa. Use if (log.isDebugEnabled()) { log.debug("..."); } y construcciones similares en su código.
5

El registro en una base de datos agrega otro punto de falla. Tuvimos una situación en la que los servidores de prueba se registraron en un DB y alguien ejecutó una consulta costosa en ese DB que ralentizó tanto que los servidores de prueba se pusieron muy, muy lentos. Iniciar sesión en un archivo puede causar problemas si se queda sin espacio, pero parece menos probable que disminuya la velocidad de toda la aplicación.

+0

buen punto, pero en realidad no es una respuesta, más un comentario. – eis

0

Recomiendo llamar API de registro (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 el registro de Yakarta commons. 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.

0

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

10

Yo le recomendaría que use SLF4J. Esto es simple fachada de la tala que soporta la mayoría de los sistemas de registro de Log4j populares (, commons-logging, de Java API de registro y Logback). Utilizándolo, , podrá reemplazar su sistema de registro de subrayado por otro cualquiera, mediante la simple actualización de CLASSPATH.

El otro beneficio de SLF4J es parameterized calls, lo que reduce el feo código de registro.

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

Cuestiones relacionadas