2017-10-06 83 views
1

如何記錄HTTP @GET@POST以分隔文件。基本上我們只是想有單獨的日誌文件來讀取(GET)和寫入(PUT,POST,DELETE)。我和Slf4jlogback與嵌入式碼頭。如何記錄HTTP GET和HTTP Post以分隔文件

一個解決方案是在課堂上有兩個記錄器並相應地使用它們。即

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

您應該將請求方法(GET,POST等)放入Logback的MDC(映射診斷上下文)中。事實上,你應該在過濾器中做到這一點,早在可能的,例如,像這樣:

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/(只是用「法」而不是「LOGFILENAME」)

+0

感謝@riskop,這是偉大的工作。感謝你的回答。 –