2016-06-16 27 views
0

次のログバックの設定は安全で適切ですか?複数のWARが同じlogback.xmlを共有しています

私は複数のWAR(展開のWebSphere 8.5.5)を持ち、それらを単一のlogback.xml

-Dlogback.configurationFile=/opt/logback.xml -Dlogback.ContextSelector=JNDI

を共有したいlogback.xmlはので、各WARは独自のログ・ファイルを取得しますJNDIBasedContextDiscriminatorSiftingAppenderを使用しています。

<appender name="SIFT" class="ch.qos.logback.classic.sift.SiftingAppender"> 
    <discriminator class="ch.qos.logback.classic.sift.JNDIBasedContextDiscriminator"> 
     <defaultValue>unknown</defaultValue> 
    </discriminator> 
    <sift> 
     <appender name="FILE-${contextName}" class="ch.qos.logback.core.FileAppender"> 
      <file>/var/log/${contextName}.log</file> 
      <encoder> 
       <pattern>%-50(%level %logger{35}) cn=%contextName - %msg%n</pattern> 
      </encoder> 
     </appender> 
    </sift> 
</appender> 

各WAR web.xmlcontextNameています:

<env-entry> 
    <description>JNDI logging context for this app</description> 
    <env-entry-name>logback/context-name</env-entry-name> 
    <env-entry-type>java.lang.String</env-entry-type> 
    <env-entry-value>ContextNameWebAppA</env-entry-value> 
</env-entry> 

答えて

0

を私はそれがLogbackは、この問題を解決方法であるように思わ JNDI弁別器を使用しても安全か良い方法であれば知りません:http://logback.qos.ch/manual/loggingSeparation.html
彼らはパフォーマンスがご使用の構成にこれを追加することで改善することができていることを示しています

<filter> 
    <filter-name>LoggerContextFilter</filter-name> 
    <filter-class>ch.qos.logback.classic.selector.servlet.LoggerContextFilter</filter-class> 
</filter> 
<filter-mapping> 
    <filter-name>LoggerContextFilter</filter-name> 
    <url-pattern>/*</url-pattern> 
</filter-mapping> 

一方、システムプロパティーの設定を避けるためにやっていることを分かち合うことができますlogback.ContextSelector=JNDI

代わりに、MDCBasedDiscriminatorを使用します。これは、MDC.put(key,value)で定義された識別値を取得します。
MDCマップはスレッドローカル変数として使用できるため、Webサーバーによって開始されたすべてのスレッドに対して設定する必要があります。
私はjavax.servlet.Filterを他のフィルターの前に置いて使用しましたが、このフィルターはMDCに正しい値を入れます。

これはあなたのやり方より優れているとは思えませんが、JNDIプロパティの代わりに、シャットダウンログがunknown.logにあるという問題があります。ここで

いくつかのコードです:

public class WarLoggingFilter implements Filter { 
    private static final String WAR_NAME_ATTRIBUTE = "WAR_NAME"; 
    private String warName; 

    @Override 
    public void init(final FilterConfig filterConfig) throws ServletException { 
     warName = filterConfig.getInitParameter(WAR_NAME_ATTRIBUTE); 
    } 

    @Override 
    public void doFilter(final ServletRequest request, final ServletResponse response, final FilterChain chain) 
      throws IOException, ServletException { 
     insertIntoMDC(warName); 
     chain.doFilter(request, response); 
    } 

    private void clearMDC() { 
     MDC.remove(WAR_NAME_ATTRIBUTE); 
    } 

    private static void insertIntoMDC(final String warName) { 
     MDC.put(WAR_NAME_ATTRIBUTE, warName); 
    } 

    @Override 
    public void destroy() { 
     clearMDC(); 
    } 


    /** 
    * Register this filter in the servlet context. Adds the necessary init 
    * parameter. 
    * 
    * @param warName 
    * @param servletContext 
    */ 
    public static void registerMe(final String warName, final ServletContext servletContext) { 
     // MDC for the startup thread 
     insertIntoMDC(warName); 
     // MCD for next threads 
     final Dynamic addFilter = servletContext.addFilter(warName, WarLoggingFilter.class); 
     addFilter.setInitParameter(WarLoggingFilter.WAR_NAME_ATTRIBUTE, warName); 
     addFilter.addMappingForUrlPatterns(null, false, "/*"); 

    } 

} 

とlogbackファイル:

<appender name="SIFT" class="ch.qos.logback.classic.sift.SiftingAppender"> 
     <discriminator class="ch.qos.logback.classic.sift.MDCBasedDiscriminator"> 
      <key>WAR_NAME</key> 
      <defaultValue>unknown</defaultValue> 
     </discriminator> 
     <sift> 
      <appender name="FILE-${WAR_NAME}" class="ch.qos.logback.core.FileAppender"> 
       <file>/tmp/${WAR_NAME}.log</file> 
       <encoder> 
        <pattern>%date{ISO8601} %-5level %logger{30}\(%line\) - %message%n</pattern> 
       </encoder> 
      </appender> 
     </sift> 
    </appender> 

と登録は春のセキュリティ初期化子で、たとえばことができます。

public class MySecurityWebApplicationInitializer extends AbstractSecurityWebApplicationInitializer { 

    /** 
    * Invoked before the springSecurityFilterChain is added. 
    * 
    * @param servletContext 
    *   the {@link ServletContext} 
    */ 
    @Override 
    protected void beforeSpringSecurityFilterChain(final ServletContext servletContext) { 
     // Tell logback to log this web app events in a separate file 
     WarLoggingFilter.registerMe("my_webapp", servletContext); 
    } 
関連する問題