2012-05-05 14 views
15

Savaş dosyası lib klasörüne logback uygulamam var ve sınıflar klasöründe aşağıdaki logback.xml dosyası var.Tomcat WAR - Yolda uygulama adını kullanmak için Logback'i yapılandırın

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

On line 3 Benim günlük dosyamın yolunu oluşturan bazı değişken değiştirmeler var.

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

Ben dağıtmış olarak o kadar ${appName} savaş dosyasının geçerli adı olarak değerlendirilen yapmak istiyorum.

Yani benim web uygulamaları klasör myapp.war için ${destination} mülkiyet .../logs/myapp için değerlendirirsiniz ve myapp-dev.war .../logs/myapp-dev için değerlendirmek diye

webapps 
- myapp.war 
- myapp-dev.war 

benziyordu eğer. AppName'e erişmek için erişebildiğim bir JNDI özelliği veya bir şey var mı?

Kaydediciyi manuel olarak yeniden yapılandırmak zorunda kalmak istemiyorum.

Teşekkürler!

+0

'a bir göz atabilirsiniz. Bunu yapmanın bir yolunun farkında değilim. Bunun için JULI (Tomcat'in yerleşik günlük kaydı) için bir geliştirme isteği vardır: https://issues.apache.org/bugzilla/show_bug.cgi?id=43682 –

+1

İşte bu soruna başka bir çözüm hakkında bir blog yazısı: https : //0x0a14.de/adding-the-context-root-to-a-logback-config-file-path/ –

cevap

10

EDIT 2013-06: Maffle Central'da OSS olarak bu Listener'u hazırladım. project homepage'a bakın.

Evet, bu mümkün. Her şeyden önce, catalina.base'a güvenebilirsiniz çünkü onsuz Tomcat çalışmayacak. İçerik adını özellik olarak enjekte etmek için. Bağlam adını JNDI içeriğine yerleştirecek ve kapanışta kaldırabileceğiniz bir içerik listener yazın. Bunu yaptıktan sonra JNDI ile değeri doğrudan logback ile alabilirsiniz. Bunun için doğrudan destek var. Bunu contextName öğesinde yazın ve işiniz bitti.

Bunu kendi başıma uygulamıştım ve tüm projelerim için çalışıyor. Siz veya bir başkasının ilgisini çekerse, tüm kodu pazartesi günü paylaşabilirim.

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

} 

Uygun yapılandırma şöyle görünür:

Bu Tomcat 6. sanırım mükemmel bir şekilde çalışır
<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> 

, bu Tomcat 7 w/çalışacak

Düzen, burada kodudur o değişiklikler.

+1

Yaklaşımın iyi sonuç verdiğini düşünürken, tomcat'i bağımlılık olarak eklememi gerektirir. ServletContextListener ile bunu yapmanın bir yolu var mı? – HaxElit

+0

Bir bağımlılığa ihtiyacınız yok. Bu uygulamanıza ait değildir, ancak tomcat/lib'de ayrı bir JAR'da. Ve hayır, bu uygulamadan yapılamaz. JDNI içeriği, uygulama içinden salt okunurdur. –

+0

Oh, bunu açıkladığın için teşekkürler. Tomcat'ın dinleyicimi kullanması için yapmam gereken yapılandırma değişikliğini de ekleyebilir misiniz? Teşekkürler – HaxElit

4

Bu, Michael-O'nun cevabı üzerine inşa edilmiştir. catalina.base'un Tomcat altında çalışırken her zaman tanımlanmış bir sistem özelliği olduğunu düşünürsek, yalnızca appName tanımlamaktan endişelenmemiz gerekir. Logback, retrieving variables from JNDI için destek sunar. appName JNDI içinde tanımlanırsa, yapılandırma dosya olur:

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

Ben ayrıca sadece logback.xml içinde yerine JNDI doğrudan AppName tanımlayabiliriz söz etmek istiyorum. (Ne de olsa, logback.xml dosyası, adının zaten kurulu olduğu web uygulamanızla birlikte gönderilir. Ancak, sorunuz bu hipotezi açıkça dışlar.) Böylece, siz oturumunuzu kapatırsınız.Eğer logback-kullanıcı listesi yayınlayarak paylaşmak çekinmeyin, tatmin edici bir çözüm bulmak kez

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

BTW: xml dosyası için basitleştirilmiş olabilir.

+0

Ceki, ben bir JIRA bilet a açabilirsiniz 'Dinleyicimi' LogBack'e bağışla. Amaca çok iyi hizmet ediyor. –

+0

Elbette, her zaman katkıları arıyorum. – Ceki

+0

Bilet oluşturuldu: http://jira.qos.ch/browse/LBCLASSIC-329 –

0

maxHistory, günlük dosyalarının sayısı anlamına gelmez. Ay sayısı demek.

İlgili konular