Custom java.util.logging Handler en tomcat

Tenemos una configuración de registro común entre todos los webapps en un sistema dado que estamos tratando de externalizar al nivel de tomcat, en lugar de tratar de manejarlo a nivel de la aplicación web individual. Los webapps que usan java.util.logging están demostrando ser un poco desafiantes porque tenemos un controlador personalizado, y no parece haber una manera obvia de hacer que el controlador personalizado funcione bien con los cargadores de clases de tomcat. Todo esto está en la etapa de prototipo en este momento.

Preliminar: Tomcat 7.0.32, Java 6. Instalación predeterminada de tomcat 7 con un servicio REST desplegado y nada divertido en la configuración.

Primero, aproximadamente siguiendo los consejos de esta respuesta , creé el controlador personalizado y puse el contenedor en $CATALINA_HOME/lib y confirmé que dicho directorio estaba en el directorio correcto y que common.loader incluía este directorio:

common.loader=${catalina.base}/lib,${catalina.base}/lib/*.jar,${catalina.home}/lib,${catalina.home}/lib/*.jar

Luego modifiqué el archivo logging.properties y agregué el controlador:

handlers = 1catalina.org.apache.juli.FileHandler, 2localhost.org.apache.juli.FileHandler, 3manager.org.apache.juli.FileHandler, 4host-manager.org.apache.juli.FileHandler, java.util.logging.ConsoleHandler, my.custom.Handler

Cuando ejecuto ./startup.sh , sin embargo, obtengo lo siguiente:

 [Loaded java.io.PrintWriter from /System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Classes/classes.jar] [Loaded java.util.logging.StreamHandler from /System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Classes/classes.jar] [Loaded java.util.logging.ConsoleHandler from /System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Classes/classes.jar] Handler error java.lang.ClassNotFoundException: my.custom.Handler at java.net.URLClassLoader$1.run(URLClassLoader.java:202) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:190) at java.lang.ClassLoader.loadClass(ClassLoader.java:306) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301) at java.lang.ClassLoader.loadClass(ClassLoader.java:247) at org.apache.juli.ClassLoaderLogManager.readConfiguration(ClassLoaderLogManager.java:521) at org.apache.juli.ClassLoaderLogManager.readConfiguration(ClassLoaderLogManager.java:464) at org.apache.juli.ClassLoaderLogManager.readConfiguration(ClassLoaderLogManager.java:288) at java.util.logging.LogManager$2.run(LogManager.java:267) [...] 

(Esto es con JAVA_OPTS=-verbose:class ).

He visto las clases relevantes cargadas más tarde, pero esto no parece ser consistente y es probablemente un artefacto del servicio REST mencionado anteriormente (que lo estaba usando directamente).

Puedo hacer que todo funcione correctamente si agrego el jar al CLASSPATH directamente, pero esto parece ser generalmente desaconsejado en lugar de modificar los cargadores.

¿Hay algo particular que me falta en cómo agregar limpiamente un java.util.logging.Handler personalizado (y, más tarde, un formateador) al cargador de clases antes de leer logging.properties ?

De forma alternativa, si no tengo problemas en el árbol equivocado, abordaría mejor el problema de una configuración de registro compartida entre varias aplicaciones web con java.util.logging .

Para el registro personalizado de Tomcat, debe inyectar su clase en el cargador de clases de arranque de Tomcat. Por lo tanto, jar con Custom Handler y las dependencias requeridas deben colocarse en el script de inicio CLASSPATH. Aconsejo agregar una secuencia de comandos personalizada en $ CATALINA_BASE / bin / setenv.sh, es decir,

 #!/bin/sh CLASSPATH="$CATALINA_BASE/bin/myhandler.jar" 

o puede recostackr los archivos necesarios de forma dinámica a medida que se carguen variables de secuencia de comandos durante el inicio de Tomcat.

    Intereting Posts