2012-02-22 20 views
2

我有多個線程生成日誌條目和我使用的logback SiftingAppender知道誰做了什麼。一切工作正常,現在即時嘗試將日誌保存到mongodb。HOWTO使用的logback鑑別值過濾的MongoDB插入

在日誌需要mongodb的要保存到嵌入文檔陣列。每個用戶的文件有一個具有包含日誌行

因爲即時通訊剛剛開始學的logback這必須有一些試驗和錯誤,現在嵌入文檔的數組一個嵌入文檔。

在下面的測試logback.xml中我有fileconsol和一個自定義appender。

我的想法是,我可以在自定義appender append()方法中找到SiftingAppender discriminator value。然後getMDCPropertyMap();在ILoggingEvent給我的MDC值,但問題是,如果這是一個有效的技術,我想要做什麼

我看不出該logback有任何原生MDC-mongodb-appender或者我可能錯過了一些東西。

<configuration> 

    <appender name="SIFT-FILE" class="ch.qos.logback.classic.sift.SiftingAppender"> 
    <!-- in the absence of the class attribute, it is assumed that the 
     desired discriminator type is 
     ch.qos.logback.classic.sift.MDCBasedDiscriminator --> 
    <discriminator> 
     <key>userid</key> 
     <defaultValue>unknown</defaultValue> 
    </discriminator> 
    <sift> 
     <appender name="FILE-${userid}" class="ch.qos.logback.core.FileAppender"> 
     <file>${userid}.log</file> 
     <append>true</append> 
     <layout class="ch.qos.logback.classic.PatternLayout"> 
      <pattern>%d [%thread] %level %mdc %logger{35} - %msg%n</pattern> 
     </layout> 
     </appender> 
    </sift> 
    </appender> 

    <appender name="SIFT-STDOUT" class="ch.qos.logback.classic.sift.SiftingAppender"> 
    <!-- in the absence of the class attribute, it is assumed that the 
     desired discriminator type is 
     ch.qos.logback.classic.sift.MDCBasedDiscriminator --> 
    <discriminator> 
     <key>userid</key> 
     <defaultValue>unknown</defaultValue> 
    </discriminator> 
    <sift> 
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> 
    <!-- encoders are assigned the type 
     ch.qos.logback.classic.encoder.PatternLayoutEncoder by default --> 
    <encoder> 
     <pattern>%-4relative [%thread] %-5level %logger{35} ${userid}- %msg %n</pattern> 
    </encoder> 
    </appender> 
    </sift> 
    </appender> 

    <appender name="SIFT-MONGO" class="ch.qos.logback.classic.sift.SiftingAppender"> 
    <!-- in the absence of the class attribute, it is assumed that the 
     desired discriminator type is 
     ch.qos.logback.classic.sift.MDCBasedDiscriminator --> 
    <discriminator> 
     <key>userid</key> 
     <defaultValue>unknown</defaultValue> 
    </discriminator> 
    <sift> 
    <appender name="MONGO" class="com.carlsberg.MongoAppender"> 

    </appender> 
    </sift> 
    </appender> 

    <root level="DEBUG"> 
    <appender-ref ref="SIFT-FILE" /> 
    <appender-ref ref="SIFT-STDOUT" /> 
    <appender-ref ref="SIFT-MONGO" /> 
    </root> 
</configuration> 

回答

1

我在我這個自定義appender中使用了SiftingAppender discriminator值。

public void append(ILoggingEvent event) { 

    Map<String, String> m = event.getMDCPropertyMap(); 
    String id = (String) m.get("userid"); 

    if(id != null){ 

     Query<UserLog> query1 = mongo.createQuery(UserLog.class); 
     query1.field("lowerCaseUserName").equal(id.toLowerCase()); 


     UpdateOperations<UserLog> up2 = mongo.createUpdateOperations 
       (UserLog.class).add("log", event.getLevel().levelStr +" "+ ft.format(event.getTimeStamp()) +" "+ event.getFormattedMessage(), true); 
     UpdateResults<UserLog> udr1 = mongo.update(query1, up2); 

     if(udr1.getError() != null){ 
      System.out.print("ERROR CANNOT SAVE to UserLog ip adress for " + id); 
     } 
    } 

}