per logs log impl errores enable debug configurar application java tomcat logging log4j slf4j

java - logs - Cómo leer log4j salida a una página web?



tomcat log file (1)

Tengo una página web, que se utiliza con fines administrativos, que ejecuta una tarea (obtención de imágenes desde un sitio remoto).
Para poder depurar la tarea solo con el navegador, sin ssh, etc., me gustaría poder leer todo el resultado de registro del hilo en ejecución y escupirlo a la página web.
La tarea se reduce a:

  1. Cambiar el nivel de registro para el hilo actual al comienzo de la llamada y restaurar cuando se realiza la llamada.
  2. Lectura de todas las salidas de registro por hilo actual y almacenamiento en una cadena.

Así que en pseudocódigo mi método execute () se vería así: (Estoy usando struts2)

public String execute() throws Exception { turnLoggingLevelToDebugOnlyForThisThread() ... do stuff... restoreLoggingLevelForThisThread() String logs = readAllLogsByThisThread(); }

¿Se puede hacer esto con log4j?

Estoy usando tomcat, struts2, log4j y slf4j.

EDITOR 1: Debo señalar que la motivación es poder ver los registros existentes en una página web sin la necesidad de agregar nuevas líneas de registro en el código. Piense en una bonita interfaz de depuración web que le permite ejecutar su operación y el resultado arroja los registros de la operación.
EDIT 2: También debería tener en cuenta que ya estoy usando log4j (a través de slf4j) y log4j.xml, por lo que la solución que estoy buscando necesita dejar de lado el sistema de registro actual, no arruinarlo.


Puede crear un apéndice log4j para escribir en un StringWriter. Aquí hay un ejemplo que hice hace un tiempo:

consoleWriter = new StringWriter(); WriterAppender appender = new WriterAppender(new PatternLayout("%d{ISO8601} %p - %m%n"),consoleWriter); appender.setName("CONSOLE_APPENDER"); appender.setThreshold(org.apache.log4j.Level.ERROR); Logger.getRootLogger().addAppender(appender);

Escribe todos los registros de ERROR en el editor de consola, pero puede establecer el alcance o el nivel de los registros como lo desee. El alcance (nombre del registrador) debe ser un identificador único del hilo. algo como esto:

Logger.getLogger("Thread-00001").addAppender(appender);

Tu hilo debe escribir en este registrador.

Logger.getLogger("Thread-00001").info("blah blah blah");

Y cuando quieras terminar de registrar el hilo:

Logger.getLogger("Thread-00001").removeAppender("CONSOLE_APPENDER");

ACTUALIZACIÓN: Aquí hay un ejemplo de trabajo. Escribe registros de errores en un archivo (establecido en log4j.xml) + escribe todos los registros de hilos en un StringWriter, cuando está habilitado:

import java.io.StringWriter; import org.apache.log4j.Logger; import org.apache.log4j.Level; import org.apache.log4j.WriterAppender; import org.apache.log4j.PatternLayout; public class Log4jTest implements Runnable { public static final String CONSOLE_APPENDER = "CONSOLE_APPENDER"; private static WriterAppender appender = null; private static int counter = 1; public static synchronized String getNextId() { return "Thread_00"+(counter++); } public void run() { String id="UNKNOWN"; try { id = getNextId(); Logger log = Logger.getLogger(id); log.addAppender(appender); log.setLevel(Level.DEBUG); log.info(id+" log message 1"); log.removeAppender(CONSOLE_APPENDER); log.info(id+" log message 2"); log.error(id+" log message 3"); } catch (Exception e) { System.out.println("Error in "+id); e.printStackTrace(); } } public static void main(String [] args) { try { StringWriter consoleWriter = new StringWriter(); appender = new WriterAppender(new PatternLayout("%d{ISO8601} %p - %m%n"),consoleWriter); appender.setName(CONSOLE_APPENDER); appender.setThreshold(org.apache.log4j.Level.DEBUG); for (int i=0; i<5; i++) { Thread t = new Thread(new Log4jTest()); t.start(); } Thread.sleep(200); System.out.println(consoleWriter.getBuffer().toString()); } catch (Exception e) { e.printStackTrace(); } } }

Y aquí está mi log4j.xml:

<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"> <log4j:configuration> <appender name="FILE" class="org.apache.log4j.RollingFileAppender"> <param name="File" value="./Log4jTest.log" /> <param name="MaxFileSize" value="1000KB" /> <param name="MaxBackupIndex" value="5" /> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="%d{ISO8601} %p - %m%n" /> </layout> <filter class="org.apache.log4j.varia.LevelRangeFilter"> <param name="LevelMin" value="WARN" /> <param name="LevelMax" value="FATAL" /> </filter> </appender> <root> <level value="ERROR" /> <appender-ref ref="FILE" /> </root> </log4j:configuration>