Maison  >  Article  >  Java  >  Comment enregistrer les journaux de connexion sur mongoDB dans SpringBoot

Comment enregistrer les journaux de connexion sur mongoDB dans SpringBoot

PHPz
PHPzavant
2023-05-18 19:01:04928parcourir

La personnalisation d'Appender est très simple, il suffit d'hériter de la classe AppenderBase.

Vous pouvez voir qu'il existe un AppenderBase, un UnsynchronizedAppenderBase et un AsyncAppenderBase qui hérite d'UnsynchronizedAppenderBase. La différence peut être vue à partir du nom, asynchrone, ordinaire et déverrouillé.

Nous définissons un MongoDBAppender qui hérite d'UnsynchronizedAppenderBase

public class MongoDBAppender extends 
    UnsynchronizedAppenderBase<ILoggingEvent> { 
 
  @Override 
  protected void append(ILoggingEvent eventObject) { 
    MongoTemplate mongoTemplate = ApplicationContextProvider.getBean(MongoTemplate.class); 
    if (mongoTemplate != null) { 
      final BasicDBObject doc = new BasicDBObject(); 
      doc.append("level", eventObject.getLevel().toString()); 
      doc.append("logger", eventObject.getLoggerName()); 
      doc.append("thread", eventObject.getThreadName()); 
      doc.append("message", eventObject.getFormattedMessage()); 
      mongoTemplate.insert(doc, "log"); 
    } 
  } 
 
}

et devons implémenter une méthode append. Cette méthode est l'endroit où la journalisation génère les journaux dans l'objet eventObject. propre traitement.

Nous pouvons imaginer que le ConsoleAppender du système est constamment System.out.print (eventObject.getXXX) et que le FileAppender utilise OutpuptStream pour sortir dans le fichier.

Ce que nous devons faire est de sauvegarder le journal sur mongo. Springboot a fourni le modèle MongoTemplate. Il convient de noter que la sortie du journal démarre au démarrage du système. il faut attendre que Spring donne la valeur attribuée à MongoTemplate. Il est donc nul au début et vous devez attendre que spring soit initialisé avant que MongoTemplate ait une valeur.

Comme cet Appender n'est pas géré au printemps, j'utilise la méthode d'obtention du haricot séparément. L'ApplicationContextProvider est le suivant :

@Component 
public class ApplicationContextProvider implements ApplicationContextAware { 
  private static ApplicationContext context; 
 
  public static ApplicationContext getApplicationContext() { 
    return context; 
  } 
 
  @Override 
  public void setApplicationContext(ApplicationContext ac) 
      throws BeansException { 
    context = ac; 
  } 
 
  public static <T> T getBean(Class<T> tClass) { 
    return context.getBean(tClass); 
  } 
 
  public static <T> T getBean(String name, Class<T> tClass) { 
    return context.getBean(name, tClass); 
  } 
}

Le stockage du journal des opérations mongo ci-dessus est relativement simple et les champs ne sont pas utilisés. Vous pouvez concevoir la structure mongo en fonction des attributs que vous souhaitez enregistrer, puis la stocker dans la base de données. .

pom.xml

<dependency>
      <groupId>org.mongodb</groupId>
      <artifactId>mongo-java-driver</artifactId>
      <version>3.4.2</version>
    </dependency>
    <dependency>
      <groupId>ch.qos.logback</groupId>
      <artifactId>logback-core</artifactId>
      <version>1.1.11</version>
    </dependency>
    <dependency> 
      <groupId>ch.qos.logback</groupId> 
      <artifactId>logback-classic</artifactId> 
      <version>1.1.11</version> 
    </dependency>

Il est également très simple à utiliser dans Spring-logback.xml

<?xml version="1.0" encoding="UTF-8"?> 
<configuration> 
  <include resource="org/springframework/boot/logging/logback/base.xml" /> 
 
  <appender name="MY_FILE" class="com.example.demo.mongo.MongoDBAppender"> 
  </appender> 
  <!-- 测试环境+开发环境. 多个使用逗号隔开. --> 
  <springProfile name="test,dev"> 
    <logger name="org.springframework.web" level="INFO"> 
      <appender-ref ref="MY_FILE"/> 
    </logger> 
    <logger name="com.example" level="INFO" /> 
  </springProfile> 
 
 
</configuration>

Il vous suffit de spécifier la classe appender.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer