5

WebLogic 10.3 にデプロイされるアプリケーションの開発に取り組んでいます。これは EAR としてパッケージ化され、1 つのモジュールが含まれています。アプリケーション自体は正常に動作しますが、ログに関連する問題に直面しています。

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>

(Maven およびカスタマイズされた WebLogic プラグインを使用して) EAR をビルドおよびデプロイし、アプリケーションを呼び出すと、ログ ファイルが表示されません。しかし、WebLogic を再起動すれば問題ありません。

WebLogic は、単一ノードのドメイン モードで Windows 7 で実行されています。

weblogic を再起動せずにログを表示する方法があるかどうか知りたいです (本番環境で問題が発生する可能性があるため)。

更新:また、このような動作の理由 (つまり、アプリケーションのデプロイ直後にログ ファイルが作成されない理由) を知りたいですか? これはWeblogic、log4j、またはそれらの結合の問題ですか? Oracleのドキュメントで答えを見つけようとしましたが、今のところうまくいきません。

4

2 に答える 2

2

いくつかのメモ:

  • 本番環境では、再デプロイせずにログ レベルを変更できるように、アプリ パッケージの外部でログ構成を保持する必要があります。
  • 本番環境で再起動を処理できるように計画する必要があります。通常、ホットサーバーとコールドサーバーがあるため、展開時に負荷を分散し、サーバーを再起動できます。

この問題について、必要に応じて、アプリの起動時に実行され、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);
    }
}

サーブレット コンテキスト リスナーの使用に関する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

したがって、サーバーを再起動せずにアプリを再デプロイするだけでは、これらの設定は使用されず、ログは開始されません。

于 2012-11-07T17:09:09.740 に答える
1

簡単な構成ソリューションが見つからなかったため、コードの変更が必要でした。

ここで提案されているように、Weblogic アプリケーション ライフサイクル リスナーを追加しました。その postStart() メソッドは、DOMConfigurator を介して log4j を明示的に初期化し、アプリケーションのデプロイ直後にログが表示されるようになりました。

構成を初期化する方法はいくつかあります。それらの 1 つはeis の投稿で言及され、もう 1 つはここで言及されました。しかし、単一モジュールを EAR に保持し、クラスタ環境でのシングルトン EJB の問題を回避するためにリスナーを選択しました (つまり、Weblogic が各ノードでシングルトンを作成するのか、クラスタごとに 1 つのインスタンスのみを作成するのかわかりません)。

また、ローカルおよび開発環境の環境変更を防ぐために、内部 log4j.xml (つまり、ear ファイル内に配置) を使用しています。

stage および prod の場合 - 外部構成ファイルが指定されます (Maven プロファイル内)。

外部ファイルは log4j によって監視されるため、変更は再デプロイや再起動なしで自動的に適用されます。

于 2012-11-13T11:16:34.270 に答える