MongoDB+Spring Boot+Swagger UI를 사용한 로그 캡처 응용 프로그램

이 이야기에서는 다음 기술을 사용한 로그 캡처 어플리케이션에 대해 설명합니다.
  • MongoDB
  • Java+ 스프링 커버
  • 흔들림 UI
  • 이 프레젠테이션 프로그램은 MongoDB가 패턴 없이 데이터를 저장하는 능력을 보여 준다.모든 로그 항목에 임의의 필드가 있을 수 있습니다. 우리는 이 임의의 필드를 통해 로그를 검색할 수 있습니다.어플리케이션을 쉽게 테스트할 수 있도록 Swagger UI를 통해 RESTAPI를 시각화합니다.

    무모드 데이터의 문제점


    이 이야기에서 우리는 제3자 응용 프로그램에서 로그 데이터를 포획하는 응용 프로그램을 구축할 것이다.이곳의 주요 도전은 이 제3자 응용 프로그램의 로그 데이터가 어떤 모습인지 모른다는 것이다.그럼에도 불구하고, 우리는 치밀한 형식으로 데이터를 저장하고, 이 로그 데이터에 대한 조회를 지원하기를 바란다.
    구체적인 예를 하나 봅시다.다음은 JSON 형식으로 저장하려는 두 가지 예제 로그입니다.

    우리는 지불 과정에서 로그를 만드는 마이크로서비스 PAYMENT을 가지고 있다.오른쪽에 LOGIN이라는 다른 프로그램에서 온 로그가 있습니다.일부 로그 필드는 severity 같은 흔한 필드이지만, 일부 필드는 creditCardProvider 등 응용 프로그램 특유의 프로그램으로, 이러한 응용 프로그램은 지불 응용 프로그램에만 존재한다.

    SQL 메서드


    이러한 데이터를 SQL 스토리지에 저장하려면 간결한 솔루션을 찾기 어렵습니다.로그 필드마다 하나의 열이 있는 거대한 테이블을 만듭니다.그러나 이것은 많은 빈 항목을 초래하고 저장 공간을 낭비하게 할 것이다.또 다른 솔루션은 JSON 형식으로 모든 데이터를 저장하기 때문에 테이블에는 메인 키와 JSON 문서가 두 줄만 있습니다.그러나 이 솔루션이 있으면 JSON 필드를 빠르게 검색할 수 없습니다.

    NoSQL 방법


    NoSQL 문서 저장소는 JSON 형식으로 데이터를 저장하고 고정 모드가 없습니다.기본적으로 문서 저장소에는 JSON 문서가 포함되며 다른 내용은 포함되지 않습니다.지정된 문서의 ID도 JSON 자체에 포함됩니다.
    이제 JSON 필드를 통해 빠른 조회가 가능하므로 다음을 수행할 수 있습니다.
    > db.logEvents.find({_appType:"PAYMENT"})
    
    이것은 위의 첫 번째 로그로 되돌아갈 것이다.더욱 흥미로운 것은 다음과 같은 조회를 수행할 수 있다는 것입니다.
    > db.logEvents.find({creditCardProvider:"VISA"})
    
    모든 로그에 creditCardProver의 필드가 포함되어 있지 않기 때문에 문서 저장이 매우 건장합니다!

    로그 캡처 응용 프로그램 구현


    그만해라, 우리 응용 프로그램을 실시하기 시작합시다!

    MongoCollection 구성


    우리는 공식 MongoCollectionMongoDB Java Driver을 사용하여 데이터베이스에 접근한다.올바른 구성을 갖춘 MongoCollection Bean을 계속 만듭니다.
    @Configuration
    public class MongoConfiguration {
      @Bean
      public MongoCollection<Document> getMongoCollection() {
        MongoClient mongoClient = MongoClients.create();
        MongoDatabase db = mongoClient.getDatabase("mydb");
        return db.getCollection("logEvents");
      }
    }
    

    MongoDB 쿼리


    위에서 설명한 Bean을 사용하여 id을 통해 MongoDB의 항목을 검색해 보겠습니다.
    public class MongoDbService {
      @Autowired
      MongoCollection<Document> collection;
    
      public Optional<Document> findById(String id) {
        Document doc = collection.find(eq("_id", new ObjectId(id))).first();
        return Optional.ofNullable(doc);
      }
    }
    
    @Autowired 주석을 사용하면 MongoCollection 유형의 Bean을 끌어올릴 수 있습니다.이 클래스는 id, 키 값에 따라 검색하고, 더 복잡한 검색, 예를 들어 보다 큰 검색 등 많은 검색 기능을 제공합니다. 제 Github repo에서 다른 검색 예시를 볼 수 있습니다.
    참고: 모든 DB 데이터는 Documents으로 공식 문서에 설명되어 있습니다.

    The Document class can represent dynamically structured documents of any complexity ... Document implements Map<String, Object>


    Java 날짜 모델


    로그 응용 프로그램에서 문서를 사용하지 않고 사용자 정의 POJO를 사용합니다.
    import lombok.Data;
    @Data
    public final class LogEvent {
      private Map<String, String> logEvent;
    }
    
    우리는 모든 로그 항목을 String개의 키와 값을 포함하는 맵으로 표시합니다.
    방주: 위의 코드 세그먼트는 Lombok을 사용하여setter,getter, 구조 함수를 만드는 간결한 방법을 제공합니다.

    LogEvent Mapper에 기록된 문서


    저희 DB층은 로그를 Document으로 표시하지만, 저희 서비스층은 LogEvent을 사용합니다.따라서 매핑 방법이 필요합니다.
    public LogEvent toLog(Document document) {
      Map<String, String> map = new HashMap<>();
      document.forEach((key, val) -> map.put(key, val.toString()));
      return new LogEvent(map);
    }
    

    REST 컨트롤러


    지금은 컨트롤러 층을 만들 때다.우리는 REST 컨트롤러를 사용할 것입니다. 이 컨트롤러는 Spring Boot의 @RequestMapping 주석을 사용하여 잘 만들 수 있습니다.
    @RequestMapping(method = RequestMethod.GET, path = "/api/log/{id}")
    public ResponseEntity<LogEvent> getLogById(
        @PathVariable(value = "id") String id) {
      return mongoDbService.findById(id)
          .map(documentToLogMapper::toLog)
          .map(ResponseEntity::ok)
          .orElse(ResponseEntity.notFound().build());
    }
    
    지금까지 우리가 작성한 모든 코드는 지금 함께 있다!😎 우리 한 걸음 한 걸음 위의 코드 부분을 봅시다!우선, 저희 REST 컨트롤러는 URI "api/log/{id}"에 HTTP GET 요청을 제공할 것입니다. id은 로그 이벤트의 식별자입니다.그 다음 REST 호출은 JSON 형식의 LogEvent을 반환합니다.셋째, 우리는 방법체에서 함수 프로그래밍을 사용한다.우리는 DB 조회를 시작하여 결과를 매핑기에 전달하고 마지막에 모든 것이 정상인지 확인하며 없으면 404 not\u FOUND 결과를 되돌려줍니다.

    스프링 부팅 서비스


    어플리케이션을 실행할 수 있도록 하려면 다음 중 하나만 필요합니다.
    @SpringBootApplication
    public class LogCaptureApp {
      public static void main(String[] args) {
        new SpringApplication(LogCaptureApp.class).run();
      }
    }
    
    이렇게 해서 이것은 모든 필요한 코드이다😊 이제 로그 응용 프로그램은 REST 요청에 로그를 읽는 서비스를 제공할 수 있습니다!

    Swagger UI 문서


    로그 캡처 프로그램에 간단한 GUI를 추가하는 것도 있습니다.이를 위해 우리는 Swagger UI을 사용한다.Swagger UI를 사용하면 추가 문제 없이 API를 시각화할 수 있습니다.Swagger만 구성하면 됩니다.
    @Configuration
    @EnableSwagger2
    public class SwaggerUIConfiguration {
      @Bean
      public Docket apiDocu() {
        return new Docket(DocumentationType.SWAGGER_2)
            .apiInfo(apiInfo())
            .select()
            .apis(RequestHandlerSelectors.basePackage("com.example.controller"))
            .paths(PathSelectors.any())
            .build();
      }
      private ApiInfo apiInfo() {
        return new ApiInfoBuilder()
            .title("Log capturing app with MongoDB + SpringBoot")
            .build();
      }
    }
    

    응용 프로그램 실행


    전체 코드는 Github에서 찾을 수 있습니다.

    회사 명 / mongodb 로그 응용 프로그램


    MongoDB 데모 응용 프로그램: 다양한 패턴 유형의 로그 이벤트 관리


    나의 Github repo는 우리가 본고에서 본 것보다 더 많은 기능을 포함하고 있다. 예를 들어 날짜 범위에 따라 로그 이벤트를 검색하고 JSON 데이터에 저장하는 로그 이벤트를 포함한다.
    따라서 이 글을 읽을 때 로그 프로그램을 실행했다면 지금부터 실행하십시오.없으면 Github의 전체 작업 예제를 사용할 수 있습니다.
    또한 표준 포트에서 MongoDB 서버를 로컬로 실행해야 합니다.그런 다음 응용 프로그램을 컴파일하고 실행합니다.
    $ git clone https://github.com/pmgysel/mongodb-logging-app.git
    $ cd mongodb-logging-app
    $ mvn clean package
    $ java -jar target/mongodb-logging-app-0.0.1-SNAPSHOT.jar
    
    가장 좋아하는 웹 브라우저의 "흔들림 UI"페이지로 이동: http://localhost:8080/swagger-ui.html

    로그 캡처 응용 프로그램은 다음과 같이 사용할 수 있습니다.
  • createLogRadom: 랜덤 로그 항목을 만들고 일부 데이터를 데이터베이스
  • 에 넣습니다
  • 또는 createLog 단점을 사용하여 임의의 로그 항목을 만듭니다.Swagger UI에 예제 요청이 표시되어 생활이 수월해집니다.😊
  • 현재 키 값 쌍(getLogByOneField) 또는 날짜 범위 (getLogByDateRange)
  • 검색 로그 통과
  • 샘플 검색:

  • 결론


    그래서 이 이야기에서 우리는 자바로 완전히 작동할 수 있는 로그 포획 프로그램을 구축했다.유연한 로그 항목을 지원하기 위해 MongoDB를 데이터베이스 솔루션으로 선택했습니다.
    이 장면은 NoSQL 문서 저장소에 적합합니다.각 응용 프로그램에는 복구 모드가 있는 경우 기존 SQL 스토리지를 사용하는 것이 좋습니다.
    마음대로 댓글 남겨주세요!그리고❤️ 만약 이 이야기가 당신에게 도움이 된다면!

    좋은 웹페이지 즐겨찾기