【问题标题】:Log file not produced until WebLogic is restarted直到 WebLogic 重新启动后才生成日志文件
【发布时间】:2012-11-07 14:51:25
【问题描述】:

我正在开发部署在 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 文档中找到答案,但现在没有运气。

【问题讨论】:

  • 尝试从 EAR 中取出 log4j.xml 并将其放在作为服务器类路径一部分的目录中(例如:$DOMAIN_HOME/lib)。这将使服务器在启动期间读取 log4j,如果需要对日志级别进行任何修改,则可以更改此 log4j.xml,而无需重新部署应用程序。看看similar post
  • Weblogic 上部署的其他 ear 文件很少,在您的帖子中您说:“我认为不可能为部署在同一 WebLogic 服务器上的不同应用程序使用不同的 log4j.xml 文件,除非log4j.xml 文件与 ear 本身打包在一起。”所以可能不是这样的。
  • 我的意思是,将 log4j.xml 放在您的 ear 文件之外总是更好。可以试试吗?
  • 哦,等等,我看到你说你的服务器也会部署其他的 ear 文件。再次将 log4j 放在耳朵外面会更好,但对所有耳朵都有一个 log4j。每个耳朵(应用程序)可以使用 log4j 中定义的不同类型的记录器。我一直说 log4j 应该在外面的原因是:当生产运营团队需要增加/减少日志级别时,他们实际上必须提取耳朵,修改 log4j 并重新部署耳朵,我认为这不是一个好主意.
  • 我明白你关于日志级别修改的观点,但目前的问题是我们在舞台和产品上根本没有日志。我们对新版本的发布有严格的截止日期。现在我必须弄清楚是否有可能在部署活动(即不重新启动服务器并将日志配置放在 EAR 之外的某个地方)和代码库中使日志显示出来,以便我们可以及时发布新版本。如果不可能,那么可能应该使用冷热服务器方法(eis 在第一个答案中提到)。

标签: java log4j weblogic ear


【解决方案1】:

一些注意事项:

  • 在 prod 环境中,您可能希望将日志配置放在应用程序包之外,这样您就可以更改日志级别而无需重新部署。
  • 您应该计划生产能够处理重新启动。我们通常有冷热服务器,因此可以在部署时平衡负载并重新启动服务器。

关于这个问题,如果你愿意,你可以指定一个在应用程序启动时运行的 servlet 并配置你的 log4j。比如:

web.xml

<servlet>
  <servlet-name>SomeServlet</servlet-name>
  <servlet-class>YourServlet</servlet-class>
  <load-on-startup>0</load-on-startup>
</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);
    }
}

还有一个 example on the web 关于使用 servlet 上下文侦听器。


编辑。至于为什么会发生这种情况,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

因此,如果您只是重新部署应用程序而不重新启动服务器,则不会使用这些设置 -> 不会启动日志记录。

【讨论】:

  • 感谢您的回复,但目前 EAR 文件中只存在 EJB 模块。而且我不确定添加 WEB 模块来初始化 log4j 是否是最好的主意。无论如何,如果我找不到其他解决方案,我会尝试使用这个。
  • @igor 添加了一条说明为什么会发生这种情况。
【解决方案2】:

我没有找到任何快速配置解决方案,因此需要更改代码。

我已按照建议 here 添加了 Weblogic 应用程序生命周期侦听器。它的 postStart() 方法通过 DOMConfigurator 显式初始化 log4j,现在日志在应用程序部署后立即出现。

初始化配置的方式很少。其中一个在eis' post 和另一个here 中被提及。但我选择监听器是为了将单个模块保留在 EAR 中,并避免集群环境中的单例 EJB 出现问题(即,我不确定 Weblogic 是否会在每个节点上创建单例,或者每个集群只创建一个实例)。

另外为了防止本地和开发环境的环境变化,我在那里使用内部 log4j.xml(即放置在 ear 文件中)。

对于 stage 和 prod - 指定外部配置文件(在 Maven 配置文件中)。

外部文件由 log4j 监控,因此更改将自动应用,无需重新部署或重新启动。

【讨论】:

  • 也许值得注意的是,添加 weblogic 应用程序生命周期侦听器是一种特定于 WL 的解决方案,使用 servlet 将是一个标准解决方案。
  • @eis,我完全同意你的观点,但是我正在从事的项目已经与 WL 高度耦合(例如,我们大量使用 OSB),所以在我的情况下,解决方案无关紧要是通用的或特定于 WL 的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-11-01
  • 2014-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多