在WebLogic重新启动之前,不会产生日志文件[英] Log file not produced until WebLogic is restarted

本文是小编为大家收集整理的关于在WebLogic重新启动之前,不会产生日志文件的处理/解决方法,可以参考本文帮助大家快速定位并解决问题,中文翻译不准确的可切换到English标签页查看源文。

问题描述

我正在研究WebLogic 10.3上部署的应用程序的开发.它被包装成耳朵,并包含一个模块.该应用程序本身可以正常工作,但我面临与记录有关的问题.

我正在使用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,log4j还是与其耦合的问题?我试图在Oracle文档中找到答案,但现在没有运气.

推荐答案

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

我已经添加了

是几种替代方法,如何初始化配置.其中之一在 eis'post 和另一个在这里.但是,我选择侦听器以使单个模块保持在呼吸中,以避免在群集环境上与Singleton EJB的问题(即,我不确定WebLogic是否会在每个节点上创建Singleton,或者每个群集只有一个实例).

也为了防止本地和开发环境的环境更改,我使用内部lo​​g4j.xml(即放置在ear文件中).

为阶段和产品 - 指定了外部配置文件(在Maven配置文件中).

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

其他推荐答案

一些注释:

  • 在产品环境中,您可能想在应用程序软件包外面进行日志配置,因此您可以在不重新部署的情况下更改日志级别.
  • 您应该计划生产能够处理重新启动.我们通常有冷热服务器,因此在部署时可以平衡负载并重新启动服务器.

关于问题,如果您愿意,您可以指定在应用程序启动上运行并配置Log4J的servlet.类似:

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);
    }
}

还有一个 examp 关于使用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

因此,如果您只是在不重新启动服务器的情况下重新启动应用程序,则不会使用这些设置 - >登录将不会启动.

本文地址:https://www.itbaoku.cn/post/1575009.html

问题描述

I'm working on the development of an application that is deployed on WebLogic 10.3. It is packaged as an EAR and includes one module. The application works fine by itself but I am faced with issue related to logging.

I am using Log4j. The library is included in the EAR file and log4j.xml is placed under JAR module. So the config location is the following:

A.ear/B.jar/log4j.xml

Log4j config is following:

<?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>

When I build and deploy EAR (using Maven and customized WebLogic plugin) and call application no log file appears. But if I restart WebLogic everything is fine.

WebLogic is running under Windows 7 in domain mode with single node.

I'd like to know if there is some way to make the log appear without weblogic restart (since it can cause issues on production environment)?

Update: Also I'd like to know what is the reason of such behavior (i.e. why the log file is not created right after application deployment)? Is this an issue with Weblogic, log4j or with their coupling? I've tried to find the answer in the Oracle documentation, but no luck for now.

推荐答案

I didn't found any quick configuration solution, so code change was required.

I've added Weblogic Application Lifecycle listener as suggested here. Its postStart() method initializes log4j explicitly through DOMConfigurator and now logs appear right after application deployment.

The are few alternatives how configuration can be initialized. One of them was mentioned in eis' post and another here. But I've choose listener in order to keep single module in EAR and in order to avoid issues with singleton EJB on cluster environment (i.e. I am not sure if Weblogic will create singleton on each node or just one instance per cluster).

Also in order to prevent environment changes for local and dev environment, I am using internal log4j.xml (i.e. placed within ear file) there.

For stage and prod - external config file is specified (in Maven profile).

External file is monitored by log4j so changes will be automatically applied without any redeployments or restarts.

其他推荐答案

Some notes:

  • In prod environment, you probably want to have your log configuration outside app packages, so you can change log levels without redeployment.
  • You should plan for production to be able to handle restarts. We usually have hot and cold servers, so load can be balanced and servers restarted when doing the deployment.

About the issue, if you want to, you could specify a servlet that is run on startup of app and configures your log4j. Something like:

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);
    }
}

There's also an example on the web about using a servlet context listener.


Edit. as to why this happens, weblogic logging mechanism is initiated by default on startup with these kind of settings:

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

so if you just redeploy your app without restarting the server, these settings will not be used -> logging will not get initiated.