我正在尝试在Tomcat log4j configuration和我的WebApp log4j配置中使用NTEventLogAppender:
*它的工作意味着我可以在Windows事件查看器中看到相关事件。
我的问题是如何修复案例C? :
我覆盖“NTEventLogAppender”java classe(跟implementation之后)调试:
loadLibrary("NTEventLogAppender.amd64.dll")
返回"already loaded in another classloader"
错误; "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日志事件。
有关如何修复它的想法吗?
答案 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)目录)。