在给定系统上的所有Web应用程序之间,我们都有一些通用的日志记录配置,我们试图将其外部化为tomcat级别,而不是尝试在单个Web应用程序级别进行处理。事实java.util.logging
证明,正在使用的Web应用程序具有一定的挑战性,因为我们有一个自定义处理程序,而且似乎没有一种明显的方法可以使该自定义处理程序与tomcat的类加载器完美配合。目前,这一切都在原型阶段。
初步:Tomcat 7.0.32,Java6。默认安装的tomcat 7安装了一项REST服务,并且配置中没有任何问题。
首先,大致遵循此答案中的建议,我创建了自定义处理程序,并将jar放入其中,$CATALINA_HOME/lib
并确认该目录在正确的目录中,并且common.loader
包括该目录:
common.loader=${catalina.base}/lib,${catalina.base}/lib/*.jar,${catalina.home}/lib,${catalina.home}/lib/*.jar
然后,我修改了logging.properties
文件并添加了处理程序:
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
./startup.sh
但是,当我运行时,会得到以下信息:
[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) [...]
(带有JAVA_OPTS=-verbose:class
)。
我已经看到稍后加载了相关的类,但这似乎并不一致,并且可能是上述REST服务(直接使用它)的产物。
如果CLASSPATH
直接将jar添加到容器中,则可以使所有组件正常工作,但是与修改加载程序相比,通常不鼓励这样做。
java.util.logging.Handler
在logging.properties
读取之前如何干净地向类加载器添加自定义(以及后来的格式化程序)的过程中,我是否缺少某些特殊之处?
另外,如果我一团糟地选择了错误的树,我会采用更好的方法来解决多个Webapp之间使用共享日志配置的问题java.util.logging
。
对于Tomcat范围内的自定义日志记录,您需要将您的类注入Tomcat BootstrapClassLoader。因此,必须将具有自定义处理程序和所需依赖项的jar放入启动脚本CLASSPATH中。我建议在$ CATALINA_BASE /bin / setenv.sh上添加一个自定义脚本,即
#!/bin/sh
CLASSPATH="$CATALINA_BASE/bin/myhandler.jar"
或者您可以在Tomcat启动期间加载脚本变量时动态收集所需的jar。
null 有人知道解决这个问题的办法吗?提前感谢! 迈克尔
可以通过实现接口或扩展任何现有的实现来创建自己的自定义处理程序。 在下面的示例中,我们通过扩展类创建了自定义处理程序。 为了理解上述与DBUtils相关的概念,让我们编写一个将运行读取查询的示例。 创建一个示例应用程序。 更新在DBUtils入门程序中创建的文件:MainApp.java。 按照下面的说明编译并运行应用程序。 以下是的内容。 以下是文件的内容。 以下是文件的内容。 完成创建源文件后
我们可以通过实现ResultSetHandler接口或扩展ResultSetHandler的任何现有实现来创建我们自己的自定义处理程序。 在下面给出的示例中,我们通过扩展BeanHandler类创建了一个自定义处理程序EmployeeHandler。 要理解与DBUtils相关的上述概念,让我们编写一个运行读取查询的示例。 要编写我们的示例,让我们创建一个示例应用程序。 步 描述 1 更新在 DB
问题内容: 谁能给我一个创建事件和处理程序的自定义集的示例。假设您有一个Person对象,您希望小部件知道它是否已更新。 您创建了一个HandlerManager,现在您必须创建一个Event和一个Handler。您将如何定义这些类,以便可以订阅和引发事件? 大多数事件都是基于DOM的,而我想创建一些自定义事件和处理程序,这些事件和处理程序可以在任何基于浏览器的事件之外触发。 问题答案: 这是一个
我有一个自定义标记处理程序test/StubCTag。java,它是一个simpletag。有一个测试。定义ctag的tld文件:- 当打包为jar存档时,文件的布局如下:- 在带有前缀testprefix的jsp页面中使用自定义标记时,浏览器会显示标记“testprefix:StubCTag”的“无法加载标记处理程序类”test.StubCTag。我已经仔细检查了归档文件,tld和类文件都存在。
我们使用高图表在单个超文本标记语言页面上绘制多个图表。 然而,一个/一些图表抛出highchart错误,我们喜欢捕捉这些错误并向用户显示不同的错误。为此,highcharts确实提供了自定义错误处理程序。但这个自定义错误处理程序不提供有关抛出该错误的特定图表的信息。 这里是highcharts提供的JS Fiddle,它适用于图表: http://jsfiddle.net/gh/get/libra