我正在开发部署在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文档中找到答案,但现在没有运气.
解决方法
一些说明:
>在prod环境中,您可能希望将日志配置放在应用程序包之外,这样您就可以在不重新部署的情况下更改日志级别.
>您应该计划生产以便能够处理重启.我们通常有冷热服务器,因此在进行部署时可以平衡负载并重新启动服务器.
关于这个问题,如果你愿意,你可以指定一个在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
因此,如果您只是在不重新启动服务器的情况下重新部署应用程序,则不会使用这些设置 – >日志记录不会被启动.