【发布时间】:2016-05-18 14:39:13
【问题描述】:
我正在尝试在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"错误; - 然后附加程序尝试加载 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 吗?
库可能不是线程安全的?
对我来说,应该在 tomcat 配置中一次性声明 appender,然后如 here 所述,我尝试将 DLL 放入 "$CATALINA_HOME/shared/lib" 并将此目录添加到我的 java.library.path 但它不起作用: 我在事件查看器中没有 tomcat 日志事件。
关于如何修复它的任何想法?
【问题讨论】:
-
谢谢我看到这个问题。明天我将尝试 loadLibrary 并使这个错误成为非致命错误(避免加载 dll 的副本),看看它是否有效。