gpt4 book ai didi

java - 使用 NTEventLogAppender 两次 : in Tomcat and in my webapp

转载 作者:行者123 更新时间:2023-11-28 23:25:46 25 4
gpt4 key购买 nike

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

  • 情况 A)我只在 Tomcat 中声明附加程序:它有效*!
  • 情况 B) 我只在我的 webapp 中声明了附加程序:它有效*!
  • 案例 C)我在 Tomcat 和我的 webapp 中声明了 appender:失败

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

我的问题是如何解决案例 C? :

  • Tomcat 日志在事件查看器中可见,但在我的 Web 应用程序日志中不可见。
  • NTEventLogAppender 静态代码在我的 webapp 启动时不起作用。

我重写“NTEventLogAppender”java 类(在 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)

似乎可以访问库,但不能访问函数。你有什么想法让 NTEventLogAppender 可以从 Tomcat 和 webapp 访问吗?

库可能不是线程安全的?

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

关于如何修复它的任何想法?

最佳答案

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

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

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

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

错误“已经加载到另一个类加载器中”(以及其他副作用)是由于我的网络应用程序依赖于 log4j 类:

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

通过删除它,我能够为我的 web 应用程序和 tomcat 日志使用诊断附加程序。

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

关于java - 使用 NTEventLogAppender 两次 : in Tomcat and in my webapp,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37302846/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com