Как использовать значение дискриминатора logback для фильтрации вставок mongodb - PullRequest
2 голосов
/ 23 февраля 2012

У меня есть несколько потоков, генерирующих записи в журнале, и я использую SiftingAppender, чтобы узнать, кто что сделал. Все работает нормально, и теперь я пытаюсь сохранить журнал на mongodb.

В mongodb журнал необходимо сохранить во встроенный массив документов. Каждый пользовательский документ имеет один встроенный документ, который содержит массив встроенных документов, содержащих строки журнала

Поскольку я только начал изучать logback, теперь это должно быть методом проб и ошибок.

В приведенном ниже тесте logback.xml у меня есть file, consol и пользовательский appender.

Моя идея состояла в том, чтобы я мог поймать SiftingAppender discriminator value в методе custom appender append(). Тогда 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 Ответ

1 голос
/ 05 июля 2012

Я использовал значение 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);
        }
    }

}
...