2012-05-05 25 views
15

私はwarbackファイルlibフォルダにログバックをデプロイしました。クラスフォルダに次のlogback.xmlがあります。 3行目のTomcat WAR - パスにアプリケーション名を使用するようにログバックを設定する

<?xml version="1.0" encoding="UTF-8" ?> 
<configuration> 
    <property name="destination" value="${catalina.base:-./temp}/logs/${appName:-myapp}" /> 

    <appender name="ROLLING" class="ch.qos.logback.core.rolling.RollingFileAppender"> 
    <file>${destination}.log</file> 
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> 
     <!-- rollover daily --> 
     <fileNamePattern>${destination}-%d{yyyy-MM-dd}.%i.log</fileNamePattern> 
     <!-- Keep logs for 7 days --> 
     <maxHistory>7</maxHistory> 

     <timeBasedFileNamingAndTriggeringPolicy 
      class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> 
     <!-- or whenever the file size reaches 100MB --> 
     <maxFileSize>100MB</maxFileSize> 
     </timeBasedFileNamingAndTriggeringPolicy> 
    </rollingPolicy> 
    <encoder> 
     <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern> 
    </encoder> 
    </appender> 

    <root level="error"> 
    <appender-ref ref="ROLLING" /> 
    </root> 
</configuration> 

私は私のログファイルのパスを作成し、いくつかの変数置換を有します。

<property name="destination" value="${catalina.base:-./temp}/logs/${appName:-myapp}" /> 

私が展開されて、それはそう${appName} warファイルの現在の名前に評価したいです。

は、だから私のWebアプリケーションフォルダがmyapp.warため ${destination}プロパティが .../logs/myappに評価されますと、myappに-dev.warが .../logs/myapp-devに評価されますので、

webapps 
- myapp.war 
- myapp-dev.war 

のように見えます。 JNDIプロパティまたはappNameにアクセスするためにアクセスできるものはありますか?

私は手動でロガーを再設定する必要はありません。

ありがとうございます!

+0

私はこれを行う方法に気づいていません。 JULI(Tomcatの組み込みログ)の拡張要求があります:https://issues.apache.org/bugzilla/show_bug.cgi?id=43682 –

+1

ここに、この問題の別の解決策に関するブログ記事があります:https ://0x0a14.de/adding-the-context-root-to-a-logback-config-file-path/ –

答えて

10

EDIT 2013-06:これをMaven CentralのOSSとして利用可能にしました。Listenerproject homepageをチェックしてください。

はい、これは実現可能です。まず、catalina.baseに依存することができます。これがなければ、Tomcatは実行されません。コンテキスト名をプロパティとして挿入するため。コンテキストlistenerを作成します。これにより、コンテキスト名がJNDIコンテキストに置かれ、シャットダウン時に削除されます。これを実行した後、JNDIで値をログバックで直接取得できます。それを直接サポートしています。それをcontextName要素に書いておけば完了です。

これは私自身で既に実装されており、すべてのプロジェクトで使用できます。あなたや他の誰かが興味を持っているなら、私はmondayでコード全体を共有することができます。

編集は、ここでのコードは次のとおりです。

import org.apache.catalina.Context; 
import org.apache.catalina.Lifecycle; 
import org.apache.catalina.LifecycleEvent; 
import org.apache.catalina.LifecycleListener; 
import org.apache.catalina.deploy.ContextEnvironment; 
import org.apache.commons.lang.StringUtils; 
import org.apache.juli.logging.Log; 
import org.apache.juli.logging.LogFactory; 

public class LogbackContextNameListener implements LifecycleListener { 

    private static final Log logger = LogFactory 
      .getLog(LogbackContextNameListener.class); 
    private Context context; 

    private String name = "logback/contextName"; 

    @Override 
    public void lifecycleEvent(LifecycleEvent le) { 

     if (le.getLifecycle() instanceof Context) 
      context = (Context) le.getLifecycle(); 
     else 
      return; 

     if (le.getType().equals(Lifecycle.START_EVENT)) { 
      ContextEnvironment ce = new ContextEnvironment(); 
      ce.setName(getName()); 
      ce.setOverride(false); 
      ce.setType("java.lang.String"); 
      String value = StringUtils.remove(context.getServletContext() 
        .getContextPath(), '/'); 
      ce.setValue(value); 
      logger.debug(String.format("Adding env entry '%s' with value '%s'", 
        getName(), value)); 
      context.getNamingResources().addEnvironment(ce); 
     } 

     if (le.getType().equals(Lifecycle.STOP_EVENT)) { 
      logger.debug(String.format("Removing env entry '%s'", getName())); 
      context.getNamingResources().removeEnvironment(name); 
     } 

    } 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     if (StringUtils.isEmpty(name)) 
      throw new IllegalArgumentException(
        "Parameter 'name' cannot be empty"); 

     this.name = name; 
    } 

} 

、適切な設定は次のようになります。

<configuration scan="true" scanPeriod="30 minutes"> 

    <insertFromJNDI env-entry-name="java:comp/env/logback/contextName" as="contextName" /> 
    <contextName>${contextName}</contextName> 

    <appender name="FILE" 
     class="ch.qos.logback.core.rolling.RollingFileAppender"> 
     <file>${catalina.base}/logs/${CONTEXT_NAME}.log</file> 
     <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> 
      <!-- daily rollover --> 
      <fileNamePattern>${catalina.base}/logs/${CONTEXT_NAME}.log.%d.gz</fileNamePattern> 
      <maxHistory>30</maxHistory> 
     </rollingPolicy> 
     <encoder> 
      <pattern>%-27(%d{HH:mm:ss.SSS} [%.-12thread]) %-5level %logger{36} - %msg%n</pattern> 
     </encoder> 
    </appender> 

    <root level="INFO"><!-- WARN --> 
     <appender-ref ref="FILE" /> 
    </root> 

</configuration> 

これは私が推測するのTomcat 6で完璧に動作しますが、それは/ wのTomcatの7上で実行されますo変化する。

+1

私はアプローチがうまくいくと思うが、それは依存関係としてTomcatを追加する必要がある。 ServletContextListenerでそれを行う方法はありますか? – HaxElit

+0

依存関係は必要ありません。これはあなたのアプリに属しませんが、tomcat/libの別個のJARにあります。そして、いいえ、これはアプリケーションからはできません。 JDNIコンテキストは、アプリ内から読み取り専用です。 –

+0

ああ、ありがとう、ありがとう。また、Tomcatにリスナーを使用させるために必要な設定変更も含めることができますか?ありがとう – HaxElit

4

これはMichael-Oの答えに基づいています。 Tomcatの下で実行するときにcatalina.baseが常に定義されたシステムプロパティであることを考慮すると、appNameの定義について心配する必要があります。 Logbackはretrieving variables from JNDIのサポートを提供します。 appNameのは、JNDIに定義されている場合、設定ファイルは次のようになります。

<configuration> 
    <!-- retrieve appName from JNDI to set the variable appName --> 
    <insertFromJNDI env-entry-name="java:comp/env/appName" as="appName" /> 
    <!-- let the context name be the applicaiton name --> 
    <contextName>${appName}</contextName> 

    <property name="destination" 
      value="${catalina.base:-./temp}/logs/${CONTEXT_NAME:-myapp}" /> 

    <appender name="ROLLING" class="ch.qos.logback.core.rolling.RollingFileAppender"> 
    <file>${destination}.log</file> 
    ... remainder of config file omitted for brevity 
    </appender> 
</configuration> 

私はあなたにもちょうどlogback.xmlではなく、JNDIに直接のappNameを定義することができることに言及したいと思います。 (結局のところ、logback.xmlファイルはあなたのweb-appと一緒に出荷されていますが、その名前はすでに確立されていますが、この仮説は明示的に除外されています)。xmlファイルをに簡素化することができます。

<configuration> 
    <contextName>the_name_of_your_webapp</contextName> 
    <property name="destination" 
      value="${catalina.base:-./temp}/logs/${CONTEXT_NAME:-myapp}" /> 
    ... the rest omitted for brevity 
</configuration? 

ところで、あなたは満足のいく解決策を見つけると、logback-ユーザーリストに掲載することにより、それを共有することを躊躇しません。

+0

Ceki、私はJIRAチケットaを開くことができます私の「Listener」をLogBackに寄付してください。それは目的を非常にうまく果たします。 –

+0

確かに、私は常に貢献を探しています。 – Ceki

+0

チケットが作成されました:http://jira.qos.ch/browse/LBCLASSIC-329 –

0

maxHistoryはログファイルの数を意味しません。それは月数を意味します。

関連する問題