Java 重新启动WebLogic之前不会生成日志文件

Java 重新启动WebLogic之前不会生成日志文件,java,log4j,weblogic,ear,Java,Log4j,Weblogic,Ear,我正在开发一个部署在WebLogic10.3上的应用程序。它打包为EAR,包括一个模块。该应用程序本身运行良好,但我面临与日志记录相关的问题 我正在使用Log4j。该库包含在EAR文件中,log4j.xml放在JAR模块下。因此,配置位置如下所示: A.ear/B.jar/log4j.xml Log4j配置如下: 当我构建和部署EAR(使用Maven和自定义WebLogic插件)并调用应用程序时,不会出现任何日志文件。但如果我重新启动WebLogic,一切都很好 WebLogic在Wind

我正在开发一个部署在WebLogic10.3上的应用程序。它打包为EAR,包括一个模块。该应用程序本身运行良好,但我面临与日志记录相关的问题

我正在使用Log4j。该库包含在EAR文件中,log4j.xml放在JAR模块下。因此,配置位置如下所示:

A.ear/B.jar/log4j.xml

Log4j配置如下:


当我构建和部署EAR(使用Maven和自定义WebLogic插件)并调用应用程序时,不会出现任何日志文件。但如果我重新启动WebLogic,一切都很好

WebLogic在Windows 7下以单节点域模式运行

我想知道是否有办法在不重新启动weblogic的情况下显示日志(因为它可能会导致生产环境出现问题)

更新:另外,我想知道这种行为的原因是什么(即,为什么在应用程序部署之后没有立即创建日志文件)?这是Weblogic、log4j或其耦合的问题吗?我试图在Oracle文档中找到答案,但目前运气不佳。

一些注意事项:

  • 在prod环境中,您可能希望将日志配置置于应用程序包之外,这样您就可以在不重新部署的情况下更改日志级别
  • 您应该为生产计划,以便能够处理重新启动。我们通常有热服务器和冷服务器,因此在进行部署时可以平衡负载并重新启动服务器
关于这个问题,如果您愿意,您可以指定一个在应用程序启动时运行的servlet,并配置您的log4j。比如:

web.xml


SomeServlet
YourServlet
0
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上下文侦听器的示例


编辑。至于为什么会发生这种情况,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
set JAVA_OPTIONS=%JAVA_OPTIONS%-Dlog4j.configuration=文件:/log4j.properties
设置JAVA_选项=%JAVA_选项%-Dorg.apache.commons.logging.Log=org.apache.commons.logging.impl.Log4JLogger
设置JAVA\u选项=%JAVA\u选项%-Dweblogic.log.Log4jLoggingEnabled=true

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

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

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

只有少数几种方法可以用来初始化配置。其中一个被提到,另一个被提到。但我选择listener是为了在EAR中保留单个模块,也是为了避免集群环境中的singleton EJB问题(即,我不确定Weblogic是在每个节点上创建singleton,还是在每个集群上只创建一个实例)

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

对于stage和prod,指定了外部配置文件(在Maven概要文件中)


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

尝试从EAR中取出log4j.xml,并将其放在服务器类路径的一部分目录中(例如:$DOMAIN\u HOME/lib)。这将使服务器在启动期间读取log4j,如果需要对日志级别进行任何修改,则无需重新部署应用程序即可更改log4j.xml。看看Weblogic上部署的其他几个ear文件,你在帖子中说:“我认为不可能在同一Weblogic服务器上为不同的应用程序部署不同的log4j.xml文件,除非log4j.xml文件与ear一起打包。”所以可能不是这样。我的观点是,最好将log4j.xml放在ear文件之外。你能试试吗?哦,等等,我看到你说你的服务器也会部署其他ear文件。同样,最好在耳朵外面有log4j,但所有耳朵都有一个log4j。每个ear(应用程序)可以使用log4j中定义的不同类型的记录器。我一直说log4j应该在外部的原因是:当生产运营团队需要增加/减少日志级别时,他们实际上必须提取ear,修改log4j并重新部署ear,我认为这不是一个好主意。我明白你关于日志级别修改的观点,但目前的问题是,我们在stage和prod上根本并没有日志。我们对新版本发布有严格的截止日期。目前,我必须弄清楚,是否有可能在部署活动(即,没有服务器重启和将日志配置放在EAR之外的某个地方)和代码库中进行最小的更改,从而使日志显示,以便我们能够及时发布新版本。如果这是不可能的,那么可能应该使用热服务器和冷服务器方法(在第一个答案中提到)。我不确定添加WEB模块来初始化log4j是否是最好的主意。无论如何,如果我找不到其他解决方案,我会尝试使用这个解决方案。@igor添加了一个关于为什么会发生这种情况的说明。也许值得注意的是,添加weblogic应用程序生命周期侦听器是一个特定于WL的解决方案,使用servlet将是一个标准的解决方案。@eis,我完全同意你的观点,但我正在从事的项目已经与WL高度耦合(例如,我们大量使用OSB),所以在我的情况下,解决方案是通用的还是特定于WL并不重要。