2017-10-06 1 views
1

HTTP @GET@POSTを別々のファイルに記録する方法を教えてください。基本的には、読み取り専用(GET)と書き込み専用(PUT、POST、DELETE)のログファイルが必要です。埋め込まれた桟橋を有するlogbackSlf4jを使用する。HTTP GETとHTTPを別々のファイルに書き込む方法

1つの解決策は、2つのロガーをクラスに入れてそれに応じて使用することです。要件ごととして今即ち

private final static Logger log = LoggerFactory.getLogger(Controller.class); 
private final static Logger writeLog = LoggerFactory.getLogger("WRITE"); 

AppenderLoggerを定義し、上記ロガーを使用します。

<appender name="APPENDER_READ" 
     class="ch.qos.logback.core.rolling.RollingFileAppender"> 
     <file>${HOME}/logs/read.log</file> 
     <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy"> 
      <fileNamePattern>read.%i.log.zip</fileNamePattern> 
      <minIndex>1</minIndex> 
      <maxIndex>3</maxIndex> 
     </rollingPolicy> 
     <triggeringPolicy 
      class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"> 
      <maxFileSize>5MB</maxFileSize> 
     </triggeringPolicy> 
     <encoder> 
      <pattern>%date{YYYY-MM-dd HH:mm:ss} %level [%thread] %X{TaskKey} %msg%n</pattern> 
     </encoder> 
    </appender> 



<appender name="APPENDER_WRITE" 
      class="ch.qos.logback.core.rolling.RollingFileAppender"> 
      <file>${HOME}/logs/write.log</file> 
      <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy"> 
       <fileNamePattern>logs/write.%i.log.zip</fileNamePattern> 
       <minIndex>1</minIndex> 
       <maxIndex>3</maxIndex> 
      </rollingPolicy> 
      <triggeringPolicy 
       class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"> 
       <maxFileSize>5MB</maxFileSize> 
      </triggeringPolicy> 
      <encoder> 
       <pattern>%date{YYYY-MM-dd HH:mm:ss} %level [%thread] %X{TaskKey} %msg%n</pattern> 
      </encoder> 
     </appender> 


    <logger name="WRITE" level="warn" additivity="false"> 
     <appender-ref ref="APPENDER_WRITE" /> 
    </logger> 


    <root level="WARN"> 
     <appender-ref ref="APPENDER_READ" /> 
    </root> 

しかし、私は(とすぐに要求が入ると)、コントローラからではなく、ハンドラレベルからではないログを開始することができますいくつかのよりよい解決策を探しています。

答えて

2

LogbackのMDC(マップされた診断コンテキスト)に要求メソッド(GET、POSTなど)を配置する必要があります。確かに、あなたは、フィルター、例えば、可能な限り早期にこれを行う必要があり、このように:

import javax.servlet.Filter; 

import org.slf4j.MDC; 

public class MDCFilter implements Filter { 

    @Override 
    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException { 
     MDC.put("METHOD", ((HttpServletRequest)req).getMethod()); 
     try { 
      chain.doFilter(req, resp); 
     } finally { 
      MDC.remove("METHOD"); 
     } 
    } 
} 

その後、あなたはLogbackのSiftingAppenderとMDCキー「メソッド」の値に基づいて別のファイルにログイン指示することができます。そのため

非常に良い例:https://www.mkyong.com/logging/logback-different-log-file-for-each-thread/

+0

おかげで@riskop(だけではなく、 'LOGFILENAME' の 'METHOD' を使用)、これは素晴らしい取り組んでいます。答えをありがとう。 –

関連する問題