Skip to content

Commit

Permalink
FEAT : CDE-195-creer-consumer-pour-generer-les-2-fichiers-de-log
Browse files Browse the repository at this point in the history
     - mise à jour de la version de oracle database jdbc
     - ajout de la création de fichiers de log dans la méthode listenInfoKbart2KafkaAndErrorKbart2Kafka
  • Loading branch information
EryneKL committed Oct 4, 2023
1 parent acd0324 commit 283c70c
Show file tree
Hide file tree
Showing 5 changed files with 83 additions and 10 deletions.
2 changes: 1 addition & 1 deletion pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -98,7 +98,7 @@
<dependency>
<groupId>com.oracle.database.jdbc</groupId>
<artifactId>ojdbc8</artifactId>
<version>21.3.0.0</version>
<version>21.9.0.0</version>
</dependency>
<!-- === Logging === -->
<dependency>
Expand Down
3 changes: 3 additions & 0 deletions src/main/java/fr/abes/logskbart/kafka/KbartListener.java
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,9 @@
@Service
@Slf4j
public class KbartListener {

// TODO Supprimer ce listener

@Autowired
private ObjectMapper mapper;

Expand Down
82 changes: 73 additions & 9 deletions src/main/java/fr/abes/logskbart/kafka/LogsListener.java
Original file line number Diff line number Diff line change
@@ -1,19 +1,26 @@
package fr.abes.logskbart.kafka;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import fr.abes.logskbart.dto.Kbart2KafkaDto;
import fr.abes.logskbart.entity.logs.LogKbart;
import fr.abes.logskbart.repository.logs.LogKbartRepository;
import fr.abes.logskbart.utils.UtilsMapper;
import lombok.extern.slf4j.Slf4j;
import org.apache.kafka.clients.consumer.ConsumerRecord;
import org.apache.kafka.common.header.Header;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.kafka.annotation.KafkaListener;
import org.springframework.stereotype.Service;

import java.io.IOException;
import java.nio.file.*;
import java.sql.Date;
import java.sql.Timestamp;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.*;

@Slf4j
@Service
public class LogsListener {

Expand All @@ -26,13 +33,70 @@ public class LogsListener {
@Autowired
private LogKbartRepository repository;

@KafkaListener(topics = {"infokbart2kafka", "errorkbart2kafka"}, groupId = "logskbart", containerFactory = "kafkaLogsListenerContainerFactory")
public void listenInfoKbart2KafkaAndErrorKbart2Kafka(ConsumerRecord<String, String> message) throws JsonProcessingException {
Kbart2KafkaDto dto = mapper.readValue(message.value(), Kbart2KafkaDto.class);
LogKbart entity = logsMapper.map(dto, LogKbart.class);
Timestamp timestamp = new Timestamp(message.timestamp());
entity.setTimestamp(new Date(timestamp.getTime()));
entity.setPackageName(message.key());
repository.save(entity);
/**
* Ecoute les topic de log d'erreurs et de fin de traitement bestPpn et génère un fichier err pour chaque fichier kbart
* @param message le message kafka
* @throws IOException exception levée
*/
@KafkaListener(topics = {"errorkbart2kafka", "bestppn.endoftraitment"}, groupId = "logskbart", containerFactory = "kafkaLogsListenerContainerFactory")
public void listenInfoKbart2KafkaAndErrorKbart2Kafka(ConsumerRecord<String, String> message) throws IOException {

if (!message.value().equals("OK")) {
Kbart2KafkaDto dto = mapper.readValue(message.value(), Kbart2KafkaDto.class);
LogKbart entity = logsMapper.map(dto, LogKbart.class);
Timestamp timestamp = new Timestamp(message.timestamp());
entity.setTimestamp(new Date(timestamp.getTime()));
entity.setPackageName(message.key().replaceAll("\\[line\\s:\\s\\d+\\]", ""));

// Si la ligne de log sur le topic errorkbart2kafka est de type ERROR
if (entity.getLevel().toString().equals("ERROR")) {
String nbrLine = message.key().substring(message.key().indexOf(".tsv")+4).replaceAll("\\[line\\s:\\s", "").replaceAll("]", "");
String fileName = message.key().replaceAll(".tsv\\[line\\s:\\s\\d+\\]", ".err");
String line = "LINE : " + nbrLine + " - MESSAGE : " + dto.getMessage();

// Vérifie qu'un fichier portant le nom du kbart en cours existe
Path of = Path.of(fileName);
if (Files.exists(of)) {
// Inscrit la ligne dedans
Files.write(of, (line + System.lineSeparator()).getBytes(), StandardOpenOption.APPEND);
} else if (!Files.exists(of)) {
try {
// Créer le fichier et inscrit la ligne dedans
Files.createFile(of);
Files.write(of, (line + System.lineSeparator()).getBytes(), StandardOpenOption.APPEND);
log.info("Fichier temporaire créé.");
} catch (SecurityException | IOException e) {
log.error("Erreur lors de la création du fichier temporaire. " + e);
throw new RuntimeException(e);
}
}
}

// Inscrit l'entity en BDD
repository.save(entity);

} else if (message.value().contains("OK")) { // Si la ligne sur le topic bestppn.endoftraitment contient OK

// Créer un nouveau Path avec le FileName (en remplaçant l'extension par .err)
Path source = null;
for (Header header : message.headers().toArray()) {
if (header.key().equals("FileName")) {
source = Path.of(new String(header.value()).replaceAll(".tsv", ".err"));
break;
}
}

// Copie le fichier existant vers le répertoire temporaire en ajoutant sa date de création
assert source != null;
if (Files.exists(source)) {
LocalDateTime time = LocalDateTime.now();
DateTimeFormatter format = DateTimeFormatter.ofPattern("yyyy-MM-dd-HH-mm-ss", Locale.FRANCE);
String date = format.format(time);
Path target = Path.of("tempLog\\" + date + "_" + source);

Files.move(source, target, StandardCopyOption.REPLACE_EXISTING);
log.info("Fichier de log transféré dans le dossier temporaire.");
}
}
}
}
3 changes: 3 additions & 0 deletions src/main/java/fr/abes/logskbart/service/KbartService.java
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,9 @@

@Service
public class KbartService {

// TODO Supprimer cette classe

private final KbartLoaderFactory factory;

private final Environment env;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,9 @@

@Service
public class KbartToTsvService implements KbartLoader {

// TODO supprimer cette classe

@Value("${path.tsvFile}")
private String pathToFichier;

Expand Down

0 comments on commit 283c70c

Please sign in to comment.