使用NTEventLogAppender两次:在Tomcat和我的webapp

时间:2016-05-18 14:39:13

标签: java tomcat logging

我正在尝试在Tomcat log4j configuration和我的WebApp log4j配置中使用NTEventLogAppender:

  • 案例A)我在Tomcat中声明了appender:它有效*!
  • 案例B)我在我的webapp中声明了appender:它有效*!
  • case C)我在Tomcat和我的webapp中声明了appender:FAILED

*它的工作意味着我可以在Windows事件查看器中看到相关事件。

我的问题是如何修复案例C? :

  • Tomcat日志在事件查看器中可见,但不在我的webapp日志中。
  • NTEventLogAppender静态代码无法从我的webapp启动中运行。

我覆盖“NTEventLogAppender”java classe(跟implementation之后)调试:

  • 第一个loadLibrary("NTEventLogAppender.amd64.dll")返回"already loaded in another classloader"错误;
  • 然后appender尝试加载32位版本("NTEventLogAppender.dll")但没有成功(因为我的主机是64位)。

所以我对这个静态部分进行了破解,从TMP目录加载另一个DLL:

static {
  LogLog.warn("************************************************ NTEventLogAppender");
  String fileToLoad="C:\\TMP\\nt\\NTEventLogAppender.amd64.dll";
try {
  System.load(fileToLoad);
  LogLog.warn(String.format("load '%s' OK", fileToLoad));
} catch(java.lang.UnsatisfiedLinkError e) {
  LogLog.error(String.format("unable to load %s : %s", fileToLoad, e.getMessage()), e);
}

在这种情况下,load(...)有效,但我收到以下错误:

java.lang.UnsatisfiedLinkError: com.mycompany.logger.NTEventLogAppender.registerEventSource(Ljava/lang/String;Ljava/lang/String;)I
at com.mycompany.logger.NTEventLogAppender.registerEventSource(Native Method)
at com.mycompany.logger.NTEventLogAppender.<init>(NTEventLogAppender.java:62)
at com.mycompany.logger.NTEventLogAppender.<init>(NTEventLogAppender.java:32)

似乎图书馆是可访问的,但不是功能。您是否有任何想法可以从Tomcat和webapp访问NTEventLogAppender?

库可能不是线程安全的吗?

对我来说,appender应该在tomcat配置中为所有人声明一次,然后如here所述,我尝试将DLL放入"$CATALINA_HOME/shared/lib"并将此目录添加到我的java.library.path但它不起作用:我在事件查看器中没有tomcat日志事件。

有关如何修复它的想法吗?

1 个答案:

答案 0 :(得分:0)

要解决此问题,我们需要从webapp中完全删除log4j jar,并且只将以下文件的一个实例保存到$CATALINA_BASE\lib\目录中:

  • NTEventLogAppender<*>.dll
  • log4j.properties
  • log4j-1.2.17.jar

我当时认为已经完成但事实并非如此,grep拯救了我的生命:

cd webapp\WEB-INF\lib && grep -rnl NTEventLogAppender

错误&#34;已经加载到另一个类加载器&#34; (和其他副作用)是由于我的网络应用程序的依赖,其中包括log4j类:

<dependency><groupId>org.graylog2</groupId><artifactId>gelfj</artifactId><version>1.1.10</version></dependency>

通过删除它,我能够为我的webapp和tomcat日志使用诊断appender。

NB /(即使在this sample的帮助下)我无法复制log4j.properties(一个用于tomcat,一个用于我的webapp)所以我只保留一个全局配置文件(来自tomcat lib)目录)。