Commit 6a713d80 authored by George Novikov's avatar George Novikov

доработка ProcessLogger, расстановка логгирования в начало и конец работы сервисов

parent 46a15c9d
Pipeline #358 canceled with stage
......@@ -4,6 +4,7 @@ build/
!gradle/wrapper/gradle-wrapper.jar
!**/src/main/**/build/
!**/src/test/**/build/
*.log
### STS ###
.apt_generated
......
......@@ -10,6 +10,7 @@ import kz.project.printedFormsService.config.SecurityContextUtils;
import kz.project.printedFormsService.data.dto.DocumentByDateDto;
import kz.project.printedFormsService.data.dto.DocumentByTemplateDto;
import kz.project.printedFormsService.exception.ValidationException;
import kz.project.printedFormsService.logging.ProcessLogger;
import kz.project.printedFormsService.service.DocumentsService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
......@@ -34,6 +35,7 @@ public class DocumentsController {
public static final String BASE_PATH = "/api/documents";
public static final String BY_DAY = BASE_PATH + "/by-day";
public static final String BY_TEMPLATE = BASE_PATH + "/by-template";
private ProcessLogger processLogger;
@GetMapping(BY_DAY)
@Operation(description = "Метод для получения данных по общему количеству генерации по всем доступным пользователю шаблонам")
......@@ -65,8 +67,10 @@ public class DocumentsController {
@DateTimeFormat(iso = DateTimeFormat.ISO.DATE) LocalDate startDate,
@RequestParam("endDate")
@DateTimeFormat(iso = DateTimeFormat.ISO.DATE) LocalDate endDate) {
processLogger.start(TemplateController.class, new Throwable().getStackTrace()[0].getMethodName(), "Получение данных генераций всех отчётов за диапазон времени");
Map<String, List<String>> projectRoleMap = SecurityContextUtils.getProjectRoleMap();
DocumentByDateDto documentsByDate = documentsService.getDocumentCountsByDate(startDate, endDate, projectRoleMap.keySet());
processLogger.finish(TemplateController.class, new Throwable().getStackTrace()[0].getMethodName(), "Получение данных генераций всех отчётов за диапазон времени");
return ResponseEntity.ok(documentsByDate);
}
......@@ -102,8 +106,10 @@ public class DocumentsController {
@DateTimeFormat(iso = DateTimeFormat.ISO.DATE) LocalDate startDate,
@RequestParam("endDate")
@DateTimeFormat(iso = DateTimeFormat.ISO.DATE) LocalDate endDate) {
processLogger.start(TemplateController.class, new Throwable().getStackTrace()[0].getMethodName(), "Получение данных генераций по шаблону за диапазон времени");
Map<String, List<String>> projectRoleMap = SecurityContextUtils.getProjectRoleMap();
DocumentByTemplateDto documentCountsByTemplate = documentsService.getDocumentCountsByTemplate(startDate, endDate, projectRoleMap.keySet());
processLogger.start(TemplateController.class, new Throwable().getStackTrace()[0].getMethodName(), "Получение данных генераций по шаблону за диапазон времени");
return ResponseEntity.ok(documentCountsByTemplate);
}
}
......@@ -9,6 +9,7 @@ import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import io.swagger.v3.oas.annotations.responses.ApiResponses;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.servlet.http.HttpServletRequest;
import kz.project.printedFormsService.data.dto.TemplateDto;
import kz.project.printedFormsService.data.dto.TemplateResponseDto;
import kz.project.printedFormsService.data.dto.TemplateShortDto;
......@@ -73,6 +74,7 @@ public class TemplateController {
})
public Map<String, byte[]> getTemplate(@Parameter(name = "id", required = true) @PathVariable Long id) throws ValidationException, JsonProcessingException {
processLogger.start(this.getClass(), new Throwable().getStackTrace()[0].getMethodName(), "Получение шаблона по идентификатору");
return service.getTemplate(id);
}
......@@ -102,8 +104,9 @@ public class TemplateController {
})
public ResponseEntity<TemplateDto> getTemplateData(@Parameter(name = "id", required = true) @PathVariable Long id) throws ValidationException {
processLogger.start(this.getClass(), new Throwable().getStackTrace()[0].getMethodName(), "Получение данных шаблона по идентификатору");
TemplateDto templateData = service.getTemplateData(id);
processLogger.finish(this.getClass(), new Throwable().getStackTrace()[0].getMethodName(), "Получение данных шаблона по идентификатору");
return ResponseEntity.ok(templateData);
}
......@@ -190,6 +193,7 @@ public class TemplateController {
@DeleteMapping(DELETE)
@Operation(description = "Метод для удаления шаблона по идентификатору")
public ResponseEntity<String> deleteTemplate(@Parameter(name = "code", required = true) @PathVariable("code") String code) throws ValidationException {
processLogger.start(this.getClass(), new Throwable().getStackTrace()[0].getMethodName(), "Удаление шаблона");
service.delete(code);
return ResponseEntity.ok("delete is success");
}
......@@ -222,8 +226,10 @@ public class TemplateController {
public Page<TemplateShortDto> getAll(@Parameter(name = "isActive") @RequestParam(value = "isActive", required = false) Boolean isActive,
@Parameter(name = "page") @RequestParam(value = "page", defaultValue = "0") Integer page,
@Parameter(name = "size") @RequestParam(value = "size", defaultValue = "50") Integer size) {
processLogger.write(TemplateController.class, "test_user", "test_ip", "Получение списка шаблонов");
return service.getAllTemplate(isActive, PageRequest.of(page, size));
processLogger.start(TemplateController.class, new Throwable().getStackTrace()[0].getMethodName(), "Получение списка шаблонов");
Page<TemplateShortDto> allTemplates = service.getAllTemplate(isActive, PageRequest.of(page, size));
processLogger.finish(TemplateController.class, new Throwable().getStackTrace()[0].getMethodName(), "Получение списка шаблонов");
return allTemplates;
}
@GetMapping(GET_ALL_BY_CODE)
......
......@@ -3,6 +3,10 @@ package kz.project.printedFormsService.converter;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.jayway.jsonpath.JsonPath;
import com.nimbusds.jwt.JWT;
import com.nimbusds.jwt.JWTParser;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.core.convert.converter.Converter;
import org.springframework.security.authentication.AbstractAuthenticationToken;
import org.springframework.security.core.GrantedAuthority;
......@@ -11,10 +15,22 @@ import org.springframework.security.oauth2.jwt.Jwt;
import org.springframework.security.oauth2.server.resource.authentication.JwtAuthenticationToken;
import org.springframework.stereotype.Component;
import java.text.ParseException;
import java.util.*;
import java.util.stream.Collectors;
@Component
public class JwtAuthConverter implements Converter<Jwt, AbstractAuthenticationToken> {
public static Map<String, Object> getTokenClaims(String token) throws ParseException {
JWT parsedJwt = JWTParser.parse(token);
return parsedJwt.getJWTClaimsSet().getClaims();
}
public static String getUsername(String token) throws ParseException {
Map<String, Object> claims = getTokenClaims(token);
if (claims == null) return null;
return (String) claims.get("preferred_username");
}
@Override
public AbstractAuthenticationToken convert(Jwt jwt) {
......
package kz.project.printedFormsService.logging;
import jakarta.servlet.http.HttpServletRequest;
import kz.project.printedFormsService.converter.JwtAuthConverter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.format.datetime.DateFormatter;
import org.springframework.http.HttpHeaders;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import java.io.File;
import java.io.FileWriter;
......@@ -14,22 +19,24 @@ import java.time.ZonedDateTime;
import java.util.Date;
import java.util.Locale;
/* Класс для логгирования старта и завершения процессов на естественном языке */
/* Класс для логгирования старта и завершения процессов в формате SIEM и на естественном языке */
@Component
public class ProcessLogger {
private static final Logger LOGGER = LoggerFactory.getLogger(ProcessLogger.class);
private static final String DEFAULT_FILE_PATH = "/var/log/processLog";
private static final String DEFAULT_FILENAME = "printService.log";
private static final String DEFAULT_FILENAME = "siem-processes.log";
private static final String DEFAULT_DELIMITER = " ";
@Value("${process-logger.file-path}")
private String logFilePath;
@Value("${process-logger.file-name}")
private String logFileName;
@Value("${process-logger.delimiter}")
private String delimiter;
@Value("${spring.application.name}")
private String serviceName;
@Value("${process-logger.start-prefix}")
private String startPrefix;
@Value("${process-logger.finish-prefix}")
private String finishPrefix;
private DateFormatter dateFormatter;
private Locale locale;
private ZoneId zoneId;
......@@ -40,19 +47,31 @@ public class ProcessLogger {
this.zoneId = zoneId;
}
public void write(Class javaClass, String userName, String ip, String description){
public void start(Class javaClass, String processName, String description){
write(javaClass, processName, startPrefix, description);
}
public void finish(Class javaClass, String processName, String description){
write(javaClass, processName, finishPrefix, description);
}
public void write(Class javaClass, String processName, String descriptionPrefix, String description){
try {
HttpServletRequest request = getRequest();
String delimiter = this.delimiter != null ? this.delimiter : DEFAULT_DELIMITER;
String filePath = this.logFilePath != null ? this.logFilePath : DEFAULT_FILE_PATH;
String fileName = this.logFileName != null ? this.logFileName : DEFAULT_FILENAME;
String ip = request.getRemoteAddr();
String fullFilePath = String.format("%s%s", filePath, fileName);
String authHeader = request.getHeader(HttpHeaders.AUTHORIZATION);
String userName = JwtAuthConverter.getUsername(authHeader.substring(7));
String logRow = String.format(
"%s%s%s%s%s%s%s%s%s%s%s",
"%s%s%s.%s%s%s%s%s%s%s%s%s%s",
serviceName,
delimiter,
javaClass.getSimpleName(),
processName,
delimiter,
getTodayDateTimeString(),
delimiter,
......@@ -60,13 +79,14 @@ public class ProcessLogger {
delimiter,
ip,
delimiter,
descriptionPrefix,
description
);
File file = new File(fullFilePath);
File file = new File(fileName);
boolean isCreated = file.createNewFile();
FileWriter writer = new FileWriter(file, true);
FileWriter writer = new FileWriter(fileName, true);
writer.append(logRow).append(System.lineSeparator());
writer.close();
} catch (Exception e){
......@@ -75,11 +95,14 @@ public class ProcessLogger {
}
private String getTodayDateTimeString(){
ZoneId zoneId = ZoneId.systemDefault();
Instant instant = new Date().toInstant();
ZonedDateTime zonedDateTime = instant.atZone(zoneId);
ZonedDateTime zonedDateTime = instant.atZone(this.zoneId);
Date today = Date.from(zonedDateTime.toInstant());
return dateFormatter.print(today, locale);
}
private HttpServletRequest getRequest(){
return ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
}
}
package kz.project.printedFormsService.service.impl;
import kz.project.printedFormsService.controller.TemplateController;
import kz.project.printedFormsService.data.dto.DTemplateTypeDto;
import kz.project.printedFormsService.data.entity.dict.DTemplateType;
import kz.project.printedFormsService.data.repository.DTemplateTypeRepository;
import kz.project.printedFormsService.logging.ProcessLogger;
import kz.project.printedFormsService.service.DTemplateTypeService;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
......@@ -13,9 +15,12 @@ import java.util.List;
@RequiredArgsConstructor
public class DTemplateTypeServiceImpl implements DTemplateTypeService {
private final DTemplateTypeRepository repository;
private ProcessLogger processLogger;
public List<DTemplateTypeDto> getAllTemplateType(){
processLogger.start(TemplateController.class, new Throwable().getStackTrace()[0].getMethodName(), "Получение типов шаблонов");
List<DTemplateType> all = repository.findAll();
processLogger.finish(TemplateController.class, new Throwable().getStackTrace()[0].getMethodName(), "Получение типов шаблонов");
return DTemplateTypeDto.toDtoList(all);
}
}
package kz.project.printedFormsService.service.impl;
import com.fasterxml.jackson.core.JsonProcessingException;
import kz.project.printedFormsService.controller.TemplateController;
import kz.project.printedFormsService.data.dto.TemplateDataForReportDto;
import kz.project.printedFormsService.data.dto.TemplateDto;
import kz.project.printedFormsService.data.dto.TemplateResponseDto;
......@@ -10,6 +11,7 @@ import kz.project.printedFormsService.data.entity.TemplateEntityVersion;
import kz.project.printedFormsService.data.entity.TemplateFileInfoEntity;
import kz.project.printedFormsService.data.repository.*;
import kz.project.printedFormsService.exception.ValidationException;
import kz.project.printedFormsService.logging.ProcessLogger;
import kz.project.printedFormsService.service.TemplateService;
import lombok.RequiredArgsConstructor;
import org.springframework.data.domain.Page;
......@@ -25,7 +27,6 @@ import java.util.List;
import java.util.Map;
@Service
@RequiredArgsConstructor
public class TemplateServiceImpl implements TemplateService {
private final TemplateRepository repository;
private final TemplateVersionRepository versionRepository;
......@@ -33,6 +34,21 @@ public class TemplateServiceImpl implements TemplateService {
private final TemplateFileInfoRepository fileInfoRepository;
private final DocumentRepository documentRepository;
private ProcessLogger processLogger;
public TemplateServiceImpl(TemplateRepository repository,
TemplateVersionRepository versionRepository,
DTemplateTypeRepository dTemplateTypeRepository,
TemplateFileInfoRepository fileInfoRepository,
DocumentRepository documentRepository,
ProcessLogger processLogger) {
this.repository = repository;
this.versionRepository = versionRepository;
this.dTemplateTypeRepository = dTemplateTypeRepository;
this.fileInfoRepository = fileInfoRepository;
this.documentRepository = documentRepository;
this.processLogger = processLogger;
}
@Override
public Map<String, byte[]> getTemplate(Long id) throws ValidationException, JsonProcessingException {
......@@ -44,6 +60,7 @@ public class TemplateServiceImpl implements TemplateService {
params.put("body", templ.getBody());
params.put("header",templ.getHeader());
processLogger.finish(this.getClass(), new Throwable().getStackTrace()[0].getMethodName(), "Получение шаблона по идентификатору");
return params;
}
......@@ -51,6 +68,8 @@ public class TemplateServiceImpl implements TemplateService {
@Override
@Transactional
public TemplateDto save(TemplateDto dto, List<MultipartFile> files) throws IOException, ValidationException {
processLogger.start(this.getClass(), new Throwable().getStackTrace()[0].getMethodName(), "Сохранение шаблона");
String fieldName = validateData(dto);
if (fieldName != null) {
throw new ValidationException("Не переданы обязательные поля: " + fieldName, 13);
......@@ -61,6 +80,9 @@ public class TemplateServiceImpl implements TemplateService {
}
TemplateEntity templateEntity = createTemplateEntity(dto, files);
TemplateEntity save = repository.save(templateEntity);
processLogger.finish(this.getClass(), new Throwable().getStackTrace()[0].getMethodName(), "Сохранение шаблона");
return TemplateDto.toDto(save);
}
......@@ -68,6 +90,8 @@ public class TemplateServiceImpl implements TemplateService {
@Override
@Transactional
public TemplateResponseDto edit(TemplateDto dto, List<MultipartFile> files) throws IOException, ValidationException {
processLogger.start(this.getClass(), new Throwable().getStackTrace()[0].getMethodName(), "Редактирование шаблона");
String fieldName = validateData(dto);
if (fieldName != null) {
throw new ValidationException("Не переданы обязательные поля: " + fieldName, 13);
......@@ -85,6 +109,8 @@ public class TemplateServiceImpl implements TemplateService {
versionRepository.save(new TemplateEntityVersion(existingEntity));
}
processLogger.finish(this.getClass(), new Throwable().getStackTrace()[0].getMethodName(), "Редактирование шаблона");
return TemplateResponseDto.toDto(repository.save(receivedEntity));
}
......@@ -96,7 +122,7 @@ public class TemplateServiceImpl implements TemplateService {
throw new ValidationException("Не найден шаблон с таким кодом", 13);
}
repository.delete(template);
processLogger.finish(this.getClass(), new Throwable().getStackTrace()[0].getMethodName(), "Удаление шаблона");
}
@Override
......@@ -105,7 +131,6 @@ public class TemplateServiceImpl implements TemplateService {
else if (isActive)
return TemplateShortDto.toDtoList(repository.findAllByStatusTrue(pageable));
else return TemplateShortDto.toDtoList(repository.findAllByStatusFalse(pageable));
}
@Override
......@@ -116,10 +141,14 @@ public class TemplateServiceImpl implements TemplateService {
@Override
public Page<TemplateDto> getAllTemplateByCode(String code, Pageable pageable) throws ValidationException {
processLogger.start(TemplateController.class, new Throwable().getStackTrace()[0].getMethodName(), "Получение всех шаблонов по коду");
if (code != null) {
Page<TemplateEntity> allByCode = repository.findAllByCode(pageable, code);
Page<TemplateEntityVersion> allVersionsByCode = versionRepository.findAllByCode(pageable, code);
processLogger.finish(TemplateController.class, new Throwable().getStackTrace()[0].getMethodName(), "Получение всех шаблонов по коду");
if (allByCode != null && allVersionsByCode != null)
return TemplateDto.toDtoList(allByCode, allVersionsByCode);
......
......@@ -29,7 +29,7 @@ spring:
datasource:
url: jdbc:postgresql://${DB_HOST:localhost}:${DB_PORT:5432}/${DB_NAME:template_db}?currentSchema=template_schema
username: ${DATASOURCE_USER:postgres}
password: ${DATASOURCE_PASSWORD:password}
password: ${DATASOURCE_PASSWORD:root}
hikari:
maximum-pool-size: ${MAXIMUM_POOL_SIZE:100}
minimum-idle: 2
......@@ -74,8 +74,9 @@ management:
enabled: false
process-logger:
file-path: /var/log/processLog
file-name: printService.log
file-name: templateService.log
delimiter: " "
date-format: "dd:MM:yyyy hh:mm:ss"
locale: kk_KZ
\ No newline at end of file
date-format: "dd.MM.yyyy HH:mm:ss"
locale: kk_KZ
start-prefix: "Начало процесса: "
finish-prefix: "Конец процесса: "
\ No newline at end of file
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment