2014-11-22 20 views
2

我正在使用MDC和密鑰"requestId"來跟蹤傳入的請求。我現在想用SMTPAppender向我發送一封包含給定請求的整個日誌的郵件,如果任何一行出錯的話。如果記錄了一些錯誤,請配置Logback以通過電子郵件將整個日誌發送給電子郵件

我知道我可以使用MDC鑑別器在請求ID之後對日誌行進行分組。問題是,SMTPAppender通過電子郵件發送第一個錯誤上的請求日誌。我希望包含該請求的後續日誌。

我不介意在每次請求後放置一個標記(但我更願意將它放在TRACE級別上)。即每次請求後,我不介意做

logger.trace(MarkerFactory.getMarker("END_OF_REQUEST"), "End of request"); 

「刷新」電子郵件。

(我試過創造我自己的評價,但我不能使它與鑑別發揮好)

回答

0

我認爲我設法解決這個問題如下:

public class MyEvaluator extends ContextAwareBase 
         implements EventEvaluator<ILoggingEvent> { 

    private String name; 
    private boolean started; 
    private Set<String> requestIdsWithErrors = new HashSet<>(); 

    public boolean evaluate(ILoggingEvent event) { 

     String requestId = MDC.get("requestId"); 
     boolean result = false; 

     if (event.getLevel().levelInt >= Level.ERROR_INT) 
      requestIdsWithErrors.add(requestId); 

     Marker marker = event.getMarker(); 
     if (marker != null && marker.getName().equals("END_OF_REQUEST")) 
      result = requestIdsWithErrors.remove(requestId); 

     return result; 
    } 

    public String getName() { return name; } 
    public void setName(String name) { this.name = name; } 
    public boolean isStarted() { return started; } 
    public void start() { started = true; } 
    public void stop() { started = false; } 
} 

我希望我可以利用SMTPAppender的鑑別器機制(並將requestIdsWithErrors替換爲boolean)。如果有人知道如何做到這一點,我會很感激,如果有人發佈了答案...