0

ローカルマシン(Windows)にwepアプリをデプロイすると、次の構成が機能します

public void contextInitialized(ServletContextEvent sce) {
    Logger logger = null;
    ServletContext servletContext = sce.getServletContext();
    String prefix = servletContext.getRealPath("/");
    String log4jFile = servletContext.getInitParameter("log4j");       
    if (log4jFile != null) {
        DOMConfigurator.configure(prefix + log4jFile);
        logger = LogManager.getLogger(StartupListener.class.getName());
        logger.info("LOG4J loaded successfully: " + log4jFile);
    }
}

<context-param>
    <param-name>log4j</param-name>
    <param-value>WEB-INF/classes/com/domain/resources/log4j.xml</param-value>
</context-param>
<listener>
    <listener-class>com.domain.util.StartupListener</listener-class>
</listener>

しかし、LinuxにWebアプリをインストールすると、次のエラーメッセージが表示されます。

log4j:ERROR Could not parse file [nullWEB-INF/classes/com/domain/resources/log4j.xml].
 java.io.FileNotFoundException: /app/home/wdmt3/AdminServer/nullWEB-INF/classes/com/domain/resources/log4j.xml (No such file or directory)

何かアドバイス ?

4

3 に答える 3

0

問題

  • servletContext.getRealPathはnullを返し、ログファイルのパスは次のようになります

      nullWEB-INF/classes/com/domain/resources/log4j.xml
    

このファイルをロードすることは不可能であり、log4jはあなたが見たエラーメッセージをスローするだけです。

  • では、なぜservletContext.getRealPathがnullを返すのでしょうか。

ServletContext.getRealPath(String path)状態のAPIドキュメント:

サーブレットコンテナが指定された仮想パスを実際のパスに変換できない場合、このメソッドはnullを返します。

コンテナが異なれば、動作もまったく異なります。

解決策

  • spring mvcのソリューションを試して、log4jFileが「/」で始まることを確認してください。

    String log4jFile = servletContext.getInitParameter("log4j"); 
    String fullPath = servletContext.getRealPath(log4jFile);
    
于 2013-03-21T05:34:34.957 に答える
0
<context-param>
    <param-name>log4j</param-name>
    <param-value>/WEB-INF/classes/com/domain/resources/log4j.xml</param-value>
</context-param>
于 2013-03-21T02:25:46.607 に答える
0

この問題は、パスを取得するために weblogic サーバーを適切に構成することで解決します (ドメイン -> Web アプリケーション -> アーカイブされた実際のパスを有効にする)。

于 2013-10-15T15:43:30.740 に答える