2017-10-06 13 views
1

Comment puis-je enregistrer les fichiers HTTP @GET et @POST dans des fichiers distincts. Fondamentalement, nous voulons juste avoir des fichiers journaux séparés pour lire (GET) et écrire (PUT, POST, DELETE). Je et en utilisant Slf4j avec logback avec jetée intégrée.Comment se connecter HTTP GET et HTTP Post à des fichiers distincts

Une solution consiste à avoir deux enregistreurs en classe et à les utiliser en conséquence. à savoir

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

Maintenant, selon l'exigence d'utiliser l'enregistreur ci-dessus, et Define 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> 

Mais je suis à la recherche d'une meilleure solution qui peut commencer à se connecter pas de contrôleur, mais à partir du niveau Handler (dès que la demande entre).

Répondre

2

Vous devez placer la méthode de requête (GET, POST, etc ...) dans MDC Logback (contexte de diagnostic mappé). En effet, vous devriez le faire le plus tôt possible, par exemple dans un filtre, comme ceci:

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

Ensuite, vous pouvez vous connecter directement dans des fichiers différents en fonction de la valeur de la clé MDC « méthode » avec SiftingAppender de Logback.

Très bon exemple pour cela: https://www.mkyong.com/logging/logback-different-log-file-for-each-thread/ (utiliser juste méthode « » au lieu de « logFileName »)

+0

Merci @riskop, cela fonctionne très bien. Merci d'avoir répondu. –