3

使用 Weblogic 11g,我做了以下事情:

1 创建了 log4j.xml 文件,我在其中创建了一个新的附加程序:

   <appender name="WEBLOGIC" class="weblogic.logging.log4j.ServerLoggingAppender">
  <param name="Threshold" value="ERROR"/>
   </appender>
   
   <root>
     <priority value="WARN"/>
     <appender-ref ref="CONSOLE"/>
     <appender-ref ref="FILE"/>
     <appender-ref ref="WEBLOGIC"/>
   </root>

2 使用以下更改更新了 ${DOMAIN_HOME}/bin/setDomainEnv.sh 脚本:

LOG4J_CONFIG_FILE="${DOMAIN_HOME}/config/log4j.xml"
if [ "${LOG4J_CONFIG_FILE}" != "" ] ; then
  JAVA_PROPERTIES="${JAVA_PROPERTIES} Dlog4j.configuration=file:${LOG4J_CONFIG_FILE}"
  export JAVA_PROPERTIES
fi

JAVA_OPTIONS="${JAVA_OPTIONS} ${JAVA_PROPERTIES} -Dweblogic.log.Log4jLoggingEnabled=true -Dwlw.iterativeDev=${iterativeDevFlag} -Dwlw.testConsole=${testConsoleFlag} -Dwlw.logErrorsToConsole=${logErrorsToConsoleFlag}"

3 将 log4j jar 复制到 domain/lib

cp ./wlserver_10.3/server/lib/wllog4j.jar user_projects/domains/my_domain/lib/

cp ./wlserver_10.3/server/lib/consoleapp/APP-INF/lib/log4j-1.2.8.jar user_projects/domains/my_domain/lib/

4 启动 AdminServer,但出现此错误:

java.lang.ClassCastException:weblogic.logging.log4j.ServerLoggingAppender 不能转换为 org.apache.log4j.Appender

4

3 回答 3

0

您必须看到的是,尽管收到了警告,但 ServerLogging 是否有效地无法在您的域上的应用程序上运行。可能甚至不存在,因为您只是将 log4j 复制到 domain/lib 文件夹而不是 wllog4j.jar。所以你的设置看起来在任何情况下都注定行不通。

在我看来,您正在经历 Class Loader Vodoo Messup。

(1) 您为整个应用服务器设置了一个全局 log4j 属性文件。

(2) 看起来 weblogic 控制台应用程序本身就是一个耳朵,它捆绑了自己的 LOG4J 实现库,您正在将其复制到您的域中。

当控制台应用程序运行时,它必须确保使用 Log4j,并且加载 Log4j Appender 定义的类加载器很可能比知道 ServerLoggin 桥适配器的类加载器低一个级别。我敢打赌,weblogic 将在未来的产品中摆脱 LOG4j。他们有太多的类加载器问题——JUL 记录你在核心类后面有 APP 类加载器——例如处理程序/适配器。

反正。

(3) 当 weblogic 运行时,namley 在引导控制台时可能会运行某种类加载器,该类加载器为捆绑在应用程序中的库提供一定程度的隔离,它会看到:哦!太好了,LOG4j 在这里,让我们初始化它。

其次,LOG4j 引导并点击您的 log4j.properties,您将服务器日志记录附加程序放在那里 - 对每个人(包括 weblogic 应用程序控制台)都是交叉的。他去寻找这个图书馆,它在哪里找到它?

其中之一是他在 weblogic 通用容器库中的某处找到的 wllog4j.jar。在 Log4j 的基本核心类中,他发现域配置或控制台应用程序的 EAR 配置中的级别较低。情况不妙。

尝试以下操作:(a) 进入 weblogic 控制台应用程序,进入 Meta Inf 文件夹并重新编写 weblogi-application.xml

它将有一个看起来像这样的首选应用程序包:org.apache.log4j.*</package-name--> <---- 这里我已经评论了这一行。

如果您注释上述行,应用程序类加载器将在知道这些类的最高父级中搜索 log4j 库。所以如果你把你的 ServerLogger 放在同一个级别,你应该没问题。

(b) 将 log4j 实现库与 wllog4j.jar 所在的级别相同。

检查您是否仍然遇到强制转换异常。

在进行服务器范围的横切配置时要非常小心。

祝你好运。

于 2015-04-25T12:47:50.123 回答
0

setDomainEnv.xml文件中,请添加如下设置的log4j.xml位置:

set LOG4J_CONFIG_FILE=C:\bea\user_projects\domains\dev\lib\log4j.xml

if NOT "%LOG4J_CONFIG_FILE%"=="" (
    set JAVA_PROPERTIES=%JAVA_PROPERTIES% -Dlog4j.configuration=file:%LOG4J_CONFIG_FILE%
)
于 2013-08-27T21:02:48.177 回答
0

保留步骤 1 并删除在其他步骤中所做的更改。

现在将 log4j.xml 复制到 $DOMAIN_HOME/lib 文件夹。这会将您的 log4j.xml 保留在服务器的类路径中,并且服务器将使用此 log4j.xml 作为其 log4j 配置。不需要额外的更改。

于 2012-11-16T05:49:06.283 回答