2016-04-07 14 views
1

現在Tomcatで動作するWebAppsでLog4J2を使用しています。各Webアプリケーションは、Webアプリケーションのコンテキストと同じ名前の個々のフォルダにログをプッシュする必要があります。各コンテキストのLog4J

webappでは、Webapp Contextの準備ができたときに気付くServletContextListenerを実装しました。これは、このようなシステムプロパティへのログのパスを設定します。

public void contextInitialized(ServletContextEvent sce) { 
    context = sce.getServletContext().getContextPath(); 
    if(context == null || context.isEmpty()){ 
     context = "ROOT"; 
    } 
    System.setProperty("WebappContext", context); 
    log.info("Context \"" + context + "\" erstellt"); 
} 

それから私はlog4j2.xmlでこのプロパティを使用します。私は最初にWebアプリケーションをデプロイするとき

<Properties> 
    <Property name="log-path">/srv/tomcat/logs/${sys:WebappContext}</Property> 
</Properties> 
<Appenders> 
    <RollingFile name="rollingLogFile" fileName="${log-path}/out.log" 
       filePattern="${log-path}/out-%d{MMM-dd--HH-mm}.log" > 
    ... 
    </RollingFile> 

これが正常に動作します。しかし、2つ以上を配備すると、すべてのコンテキストのすべてのログが最新のフォルダに移動します。これは、システムプロパティがすべてのインスタンスに対してグローバルであるためです。場合によっては、「{sys:WebappContext}」という名前のフォルダがあり、ログが書き込まれることもあります。

私が望むロギングを達成する正しい方法は何ですか?

答えて

1

システムルックアップの代わりにウェブコンテキストルックアップを使用してみてください。

出典: https://logging.apache.org/log4j/2.0/manual/lookups.html#WebLookup

WebLookupは、アプリケーションがのServletContextに関連付けられている ある変数を取得することができます。 がServletContext内のさまざまなフィールドを取得できることに加えて、WebLookupは の値を検索して属性として格納するか、初期化として設定します。 パラメータ。

  • attr.nameが 指定された名前
  • のcontextPathウェブのコンテキストパス
  • effectiveMajorVersion取得 アプリケーションでのServletContext属性を返します。次の表は、 を取得できる各種キーを示していますこの ServletContextによって表されるアプリケーションが基づいているサーブレット仕様 のメジャーバージョンです。
  • effectiveMinorVersionこのServletContextによってアプリケーション が表すサーブレット仕様のマイナー バージョンを取得します。
  • initParam.nameが指定した名前
  • MAJORVERSIONで のServletContext初期化パラメータを返しますが、この サーブレットコンテナがサポートするServlet APIのメジャーバージョンを返します。
  • minorVersionこのサーブレットコンテナがサポートするサーブレットAPIのマイナーバージョン を返します。
  • rootDir "/"の値でgetRealPathを呼び出した結果を返します。
  • serverInfoサーブレットが実行されている 上のサーブレットコンテナの名前とバージョンを返します。 配備記述子の表示-name要素で定義されているよう
  • servletContextNameは Webアプリケーションの名前を返します

<Appenders> 
    <File name="ApplicationLog" fileName="${web:rootDir}/app.log"/> 
</Appenders> 
+0

'contextPath'は仕事をしました、ありがとう!今後の読者には:log4j-web(バージョン2.5以上)の依存関係も持っていることを確認してください! – user3774337

1

私は通常、ちょうどそれぞれ個別log4j2.xmlを使用ウェブアプリケーション

<properties> 
    <property name="LOG_DIR">${sys:catalina.home}/logs/AppName</property> 
</properties> 

ただし、単一のlog4j2.xmlが必要な場合は、followi NG alan7678のアドバイスは、あなたが

<context-param> 
    <param-name>applicationName</param-name> 
    <param-value>AccountService</param-value> 
</context-param> 

をweb.xmlに追加して、しかし

<properties> 
    <property name="LOG_DIR">${sys:catalina.home}/logs/${web:applicationName}</property> 
</properties> 

を使用することができるはず、私はこれを自分で試していません。