verificadas todas tipos propagacion programacion personalizadas manejo las excepciones ejemplos arbol java spring tomcat logging log4j

java - todas - tipos de excepciones en programacion



Registrar excepciones de tiempo de ejecuciĆ³n en Java usando log4j (3)

Actualmente estoy creando una aplicación usando Tomcat, Spring y JAVA. Estoy usando Log4J como mi biblioteca de registro. Actualmente estoy registrando todo en un archivo de texto. Uno de los problemas que tengo es que las RuntimeExceptions no se registran en ningún archivo. Me preguntaba si hay una manera de registrar todas las RuntimeExceptions que quizás se lancen a mi archivo de registro de la aplicación. Si no es así, ¿es posible tenerlo registrado en otro archivo de registro? ¿Hay una manera estándar de hacer esto? Si es así, ¿hay una forma estándar de hacer esto al ejecutar su aplicación dentro de Tomcat?

¡Gracias de antemano por su ayuda!


No estoy seguro de si esto es lo que está buscando, pero hay un controlador para las excepciones que terminan los hilos. Es un controlador para cualquier excepción que no sea capturada explícitamente por el objetivo del hilo.

El "controlador de excepciones no printStackTrace() " predeterminado simplemente llama a printStackTrace() en el Throwable para imprimir el seguimiento de la pila en System.err . Sin embargo, puede replace esto con su propio UncaughtExceptionHandler que registra la excepción a log4j en su lugar:

class Log4jBackstop implements Thread.UncaughtExceptionHandler { private static Logger log = Logger.getLogger(Log4jBackstop.class); public void uncaughtException(Thread t, Throwable ex) { log.error("Uncaught exception in thread: " + t.getName(), ex); } }

Si está utilizando una estructura ejecutora a la que le pasa un objeto Runnable , sus subprocesos probablemente tengan su propio bloque catch que impide que las excepciones alcancen el controlador de excepciones no capturado. Si desea capturar las excepciones de Runtime allí, una forma de hacerlo es envolver cada tarea en un contenedor de registro, como este:

class Log4jWrapper { private final Logger log; private final Runnable target; Log4jWrapper(Logger log, Runnable target) { this.log = Objects.requireNonNull(log); this.target = Objects.requireNonNull(target); } public void run() { try { target.run(); } catch(RuntimeException ex) { log.error("Uncaught exception.", ex); throw ex; } } } ... Runnable realTask = ...; executor.submit(new Log4jWrapper(Logger.getLogger(Whatever.class), realTask));


Puede intentar redirigir el StdErr para usar su registrador. Esto debería generar el resultado de cualquier cosa escrita en su error estándar (que debe incluir excepciones no manejadas)

Esta publicación de blog ofrece un buen resumen de cómo hacer la redirección a un FileHandler que está aparte de su registrador.

https://blogs.oracle.com/nickstephen/entry/java_redirecting_system_out_and


Una forma de registrar las RuntimeExceptions no capturadas (o cualquier Thread.UncaughtExceptionHandler ) es crear una clase que implemente Thread.UncaughtExceptionHandler . El método uncaughtException() esta clase simplemente escribiría los detalles de la excepción en el registro. Puede hacer que la JVM llame a este controlador de excepciones cada vez que una excepción RuntimeException no finalizada termine un hilo agregando la línea

Thread.setDefaultUncaughtExceptionHandler(new MyExceptionHandler());

a su codigo