2012-02-22 10 views
2

ログエントリを生成するスレッドが複数あり、誰が何をしたのかを知るためにlogback SiftingAppenderを使用します。すべてうまく動作し、現在ログをmongodbに保存しようとしています。howtoログバック識別子を使用してmongodbの挿入をフィルタリングする

mongodbでは、ログは埋め込みドキュメント配列に保存する必要があります。すべてのユーザー文書には、ログ行を含む埋め込み文書の配列を持つ1つの埋め込み文書があります。

これは何らかの試行錯誤が必要です。

以下のlogback.xmlのテストでは、私はfile,consolとカスタムアペンダーを持っています。

私の考えは、私がカスタムアペンダーappend()メソッドでSiftingAppender discriminator valueを捕まえることができたということでした。次に、getMDCPropertyMap()ILoggingEventで私にMDC値を教えてもらえますが、これは私がやりたいことのために効率的なテクニックであるかどうかです。

ログアウトにはネイティブ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

私はこのような私のカスタムアペンダーで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); 
     } 
    } 

} 
関連する問題