¿Como crear un log utilizando la libreria log4j en un webservice y enviarlo a un archivo .log?

Que tal buen dia, mi intencion es crear un log para un webservice y que se registre en archivo con extension .log, he logrado esto en una aplicacion de escritorio pero ha aplicado el mismo metodo para el webservice y no me funciona, espero alguien me pueda ayudar a configurar log4j en una aplicacion web, de antemano muchas gracias.

Comentarios

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de ezamudio

no es difícil

Es como con cualquier aplicación web, tienes que fijarte si el contenedor ya provee log4j para que entonces lo metas en tu proyecto como dependencia tipo "provided" o sea que la tengas local para compilar pero no se incluya en tu war/ear/aar/loquesear, o si el contenedor que vas a usar no la provee pues la metes a tu war/ear/aar/loquesear.

Y luego viene la configuración, ahí es donde está todo el chiste, lo recomendable es que escribas el archivo en un lugar afuera del contenedor, dependiendo tu sistema operativo (por ejemplo en Linux en /var/log). La configuración simple es con el log4j.properties que debes tener dentro de tu WEB-INF/classes, o puedes usar la config con xml que es más sofisticada y te da mayor control (por ejemplo puedes usar el logger asíncrono).

Un ejemplo que vi muy recientemente es la aplicación de Axis2. El axis2.war incluye log4j (lo ves en el WEB-INF/lib) y la config está en WEB-INF/classes, pero hay que hacerle algunas modificaciones a la que viene por default, yo lo que hice fue modificar dos lineas:

log4j.rootCategory=INFO, CONSOLE

la cambié a

log4j.rootCategory=INFO, CONSOLE, LOGFILE

y la línea de

log4j.appender.LOGFILE.File=axis2.log

la cambié a

log4j.appender.LOGFILE.File=/tmp/axis2.log

(es decir poner una ruta absoluta).

Luego de eso ya que veas que se genera tu archivo, puedes controlar qué cosas imprimir y cuáles no, es decir el nivel de log, según los paquetes que te interesan, por ejemplo si los tuyos comienzan con mx.bla puedes agregas una línea:

log4j.logger.mx.bla=TRACE

o puedes poner DEBUG o INFO o lo que quieras (en el ejemplo de axis2, está por default a nivel INFO pero hasta eso puedes cambiar).

Finalmente si no te gusta el formato que venga por default pues lo modificas en la propiedad ConversionPattern, busca en los docs de log4j ahí vienen todos los especificadores que puedes usar, por ejemplo como yo uso el DailyRollingFileAppender para tener un archivo de log por día, pues en el nombre del archivo queda la fecha, por lo tanto solamente me interesa en las entradas del log tener la hora exacta, así que uso el formato %d{ABSOLUTE} [%t] %-5p %m%n lo cual genera líneas de este tipo:

15:16:28,356 [nombre-del-thread] DEBUG y luego aquí ya va el mensaje del log

no incluyo el nombre de la clase porque estoy usando el AsyncAppender y no lo soporta, pero si usas directo el DailyRollingFileAppender puedes incluir %c para ver el nombre de la clase de donde salió el log.

Gracias ezamudio ya realice

Gracias ezamudio ya realice una pequeña practica y obtuve los resultados que deseaba, gracias.