2016-04-07 23 views
1

Şu anda Tomcat üzerinde çalışan WebApps üzerinde Log4J2 kullanıyorum. Her webapp, günlüklerini webapp'ın içeriği gibi adlandırılan tek bir klasöre itmek zorundadır.Her içerik için Log4J

Webapp'da, Webapp Bağlamı hazır olduğunda fark edilen bir ServletContextListener uyguladım. Böyle sistem özelliğine günlüğü yolunu ayarlar:

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

Sonra log4j2.xml bu özelliği kullanın: İlk webapp dağıtmak, bu iyi çalışır

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

. Ancak, iki veya daha fazla dağıtımı tamamladığım zaman, tüm bağlamlardan tüm günlükler en yeni klasöre gider, çünkü sistem özelliği tüm örneklerde geneldir. Bazen bazı günlüklerin yazıldığı "{sys: WebappContext}" adında bir klasör bile alırım.

İstediğim günlük bilgisine ulaşmanın doğru yolu nedir?

cevap

1

Sistem araması yerine web içeriği aramayı kullanmayı deneyin.

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

WebLookup uygulamaları ServletContext'te ilişkili olan değişkenler almak için izin verir. , ServletContext'te çeşitli alanlara sahip olmanın yanı sıra, WebLookup, özelliklerini öznitelik olarak saklanan veya başlangıçta parametreleri olarak yapılandırılmış değerleri desteklemektedir.

  • attr.name belirtilen ad
  • contextPath web bağlam yolu
  • effectiveMajorVersion alır uygulama ile ServletContext'te niteliğini döndürür: Aşağıdaki tabloda alınabilir çeşitli anahtarları listeler Bu ServletContext tarafından temsil edilen uygulamanın temel aldığı Servlet belirtiminin temel sürümü temel alınmıştır.
  • effectiveMinorVersion Uygulamanın ServletContext tarafından temsil ettiği uygulamanın alt sınırı olan sürümünü alır.
  • initParam.name Belirtilen ada
  • majorVersion Servlet API bu servlet konteyner destekleri önemli sürümünü döndürür ile ServletContext'te başlatma parametresi döndürür.
  • minorVersion Bu servlet konteynerinin desteklediği sunucu API'sinin küçük sürümünü döndürür.
  • rootDir getRealPath değerinin "/" değeriyle çağrılması sonucu döndürür.
  • serverInfo Servlet'in çalıştığı üzerindeki sunucu kasasının adını ve sürümünü döndürür. dağıtım tanımlayıcısı görüntü adı elemanında tanımlanan
  • servletContextName web uygulaması adını verir

Örnek

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

'contextPath' işini yaptı, teşekkürler! Gelecek okuyucular için: ayrıca bağımlılık log4j-web (sürüm 2.5 veya üstü) olduğundan emin olun! – user3774337

1

Genellikle sadece her biri için ayrı bir log4j2.xml kullanımı

Ancak, tek bir log4j2.xml istiyorsanız ng alan7678 en tavsiyem

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

web.xml için ekleyebilir ve daha sonra Bununla

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

kullanmak gerekir, ben bu kendim denemedim.