我正在开发部署在WebLogic 10.3上的应用程序。它被打包为EAR并包含一个模块。该应用程序本身工作正常但我遇到了与日志记录相关的问题。
我正在使用Log4j。该库包含在EAR文件中,log4j.xml位于JAR模块下。所以配置位置如下:
A.ear/B.jar/log4j.xml
Log4j配置如下:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
<appender name="CA" class="org.apache.log4j.ConsoleAppender">
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d{dd-MMM-yyyy-HH:mm:ss} %p %C{1} - %m%n" />
</layout>
</appender>
<appender name="DRFA" class="org.apache.log4j.DailyRollingFileAppender">
<param name="file"
value="servers/AdminServer/logs/EJB.log" />
<param name="Append" value="true" />
<param name="DatePattern" value="'-'yyyy-MM-dd" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d{dd-MMM-yyyy-HH:mm:ss} %p %C{1} - %m%n" />
</layout>
</appender>
<logger name="com.companyname.ejb" additivity="false">
<level value="DEBUG" />
<appender-ref ref="DRFA" />
<appender-ref ref="CA" />
</logger>
<logger name="com.companyname.results" additivity="false">
<level value="DEBUG" />
<appender-ref ref="DRFA" />
<appender-ref ref="CA" />
</logger>
<logger name="com.companyname.marketdata" additivity="false">
<level value="DEBUG" />
<appender-ref ref="DRFA" />
<appender-ref ref="CA" />
</logger>
<root>
<level value="DEBUG" />
<appender-ref ref="CA" />
</root>
当我构建和部署EAR(使用Maven和自定义WebLogic插件)并调用应用程序时,不会显示日志文件。但是,如果我重新启动WebLogic,一切都很好。
WebLogic在域模式下使用单个节点在Windows 7下运行。
我想知道是否有一些方法可以在没有weblogic重启的情况下显示日志(因为它可能会导致生产环境出现问题)?
更新:此外,我想知道这种行为的原因是什么(即为什么在应用程序部署后不立即创建日志文件)?这是Weblogic,log4j或它们的耦合问题吗?我试图在Oracle文档中找到答案,但现在没有运气。
答案 0 :(得分:2)
一些注意事项:
关于这个问题,如果你愿意,你可以指定一个在app启动时运行的servlet并配置你的log4j。类似的东西:
的web.xml
<servlet>
<servlet-name>SomeServlet</servlet-name>
<servlet-class>YourServlet</servlet-class>
<load-on-startup>0</load-on-startup>
</servlet>
的Servlet
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import org.apache.log4j.xml.DOMConfigurator;
public class YourServlet extends HttpServlet
{
@Override
public void init(final ServletConfig config)
throws ServletException
{
final java.net.URL url = Thread.currentThread().getContextClassLoader()
.getResource("Log4j.xml");
DOMConfigurator.configure(url);
}
}
还有一个关于使用servlet上下文监听器的example on the web。
编辑。至于为什么会发生这种情况,weblogic日志记录机制在启动时默认启动时使用以下类型的设置:
set JAVA_OPTIONS=%JAVA_OPTIONS% -Dlog4j.configuration=file:<path>/log4j.properties
set JAVA_OPTIONS=%JAVA_OPTIONS% -Dorg.apache.commons.logging.Log=org.apache.commons.logging.impl.Log4JLogger
set JAVA_OPTIONS=%JAVA_OPTIONS% -Dweblogic.log.Log4jLoggingEnabled=true
因此,如果您只是重新部署应用而不重新启动服务器,则不会使用这些设置 - &gt;日志记录将无法启动。
答案 1 :(得分:1)
我没有找到任何快速配置解决方案,因此需要更改代码。
我已根据建议here添加了Weblogic Application Lifecycle侦听器。它的postStart()方法通过DOMConfigurator显式初始化log4j,现在日志在应用程序部署后立即出现。
可以如何初始化配置。 eis' post和另一个here中提到了其中一个。但是我选择了监听器以便在EAR中保留单个模块,以避免单个EJB在集群环境中出现问题(即我不确定Weblogic是在每个节点上创建单例还是在每个集群上只创建一个实例)。 p>
另外为了防止本地环境和开发环境的环境变化,我在那里使用内部log4j.xml(即放在ear文件中)。
对于stage和prod - 指定了外部配置文件(在Maven配置文件中)。
外部文件由log4j监控,因此无需重新部署或重新启动即可自动应用更改。