【问题标题】:Use NTEventLogAppender twice: in Tomcat and in my webapp使用 NTEventLogAppender 两次:在 Tomcat 和我的 webapp 中
【发布时间】: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 的副本),看看它是否有效。

标签: java tomcat logging


【解决方案1】:

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

  • NTEventLogAppender&lt;*&gt;.dll
  • log4j.properties
  • log4j-1.2.17.jar

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

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

“已在另一个类加载器中加载”错误(和其他副作用)是由于我的 Web 应用程序的依赖关系,其中包括 log4j 类:

&lt;dependency&gt;&lt;groupId&gt;org.graylog2&lt;/groupId&gt;&lt;artifactId&gt;gelfj&lt;/artifactId&gt;&lt;version&gt;1.1.10&lt;/version&gt;&lt;/dependency&gt;

通过删除它,我可以为我的 webapp 和 tomcat 日志使用诊断附加程序。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多