애플리케이션 로그 모니터

2024. 10. 7. 19:33모니터링

2024/10/07

 

 

※  Loki에 대해 알아보자.

   ▶ Loki란❓

Loki는 Grafana Labs에서 개발한 로그 집계 시스템으로, Prometheus의 메트릭 수집 방식과 유사하게 로그 데이터를 수집하고 쿼리할 수 있도록 설계됐다. Loki는 주로 로그 데이터를 저장하고, 이를 Grafana를 통해 시각화하는 데 사용된다. Loki의 주요 특징 중 하나는 라벨 기반의 메타데이터를 사용하여 로그를 효율적으로 검색할 수 있다는 점이다.

 

   ▶ loki-logback-appender

      ○  loki-logback-appender는 Logback을 사용하는 Java 애플리케이션에서 로그를 Loki로 직접 전송하기 위한 라이브러리다.
      ○  이 라이브러리를 사용하면 별도의 Promtail 설정 없이도 로그를 Loki로 전송할 수 있다.

 

   ▶ 스프링 프로젝트 설정

       ●   build.gradle 파일

dependencies { 
	implementation 'com.github.loki4j:loki-logback-appender:1.5.1' //추가 

	implementation 'org.springframework.boot:spring-boot-starter-actuator' 
	implementation 'org.springframework.boot:spring-boot-starter-web' 
	runtimeOnly 'io.micrometer:micrometer-registry-prometheus' 
	testImplementation 'org.springframework.boot:spring-boot-starter-test' 
	testRuntimeOnly 'org.junit.platform:junit-platform-launcher' 
}



       ●   SampleController.java

        📍 루프 페이지에 접속하면 403에러를 발생하며 로그도 발생시킨다.

import jakarta.servlet.http.HttpServletResponse;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import java.io.IOException;

@RestController
public class SampleController {

    private static final Logger logger = LoggerFactory.getLogger(SampleController.class);

    @GetMapping("/")
    public String hello(HttpServletResponse response) throws IOException {
        logger.info("Attempted access to / endpoint resulted in 403 Forbidden");
        response.sendError(HttpServletResponse.SC_FORBIDDEN, "Access Denied");
        return null;
    }
}


       ●    resources/logback.xml 파일을 생성한다.

<configuration>
    <appender name="LOKI" class="com.github.loki4j.logback.Loki4jAppender">
        <http>
            <url>http://localhost:3100/loki/api/v1/push</url>
        </http>
        <format>
            <label>
                <pattern>app=my-app,host=${HOSTNAME}</pattern>
            </label>
            <message class="com.github.loki4j.logback.JsonLayout" />
        </format>
    </appender>

    <root level="DEBUG">
    <appender-ref ref="LOKI" />
    </root>
</configuration>

 

 

   ▶ Loki (With Docker)

 

       ●   폴더를 만들고 loki-config.yml 파일을 만든다.
        👉  https://grafana.com/docs/loki/latest/setup/install/docker/ 문서를 참고한다.

auth_enabled: false

server:
  http_listen_port: 3100
  grpc_listen_port: 9096

common:
  instance_addr: 127.0.0.1
  path_prefix: /tmp/loki
  storage:
    filesystem:
      chunks_directory: /tmp/loki/chunks
      rules_directory: /tmp/loki/rules
  replication_factor: 1
  ring:
    kvstore:
      store: inmemory

query_range:
  results_cache:
    cache:
      embedded_cache:
        enabled: true
        max_size_mb: 100

schema_config:
  configs:
    - from: 2020-10-24
      store: tsdb
      object_store: filesystem
      schema: v13
      index:
        prefix: index_
        period: 24h

ruler:
  alertmanager_url: 

# By default, Loki will send anonymous, but uniquely-identifiable usage and configuration
# analytics to Grafana Labs. These statistics are sent to <https://stats.grafana.org/>
#
# Statistics help us better understand how Loki is used, and they show us performance
# levels for most users. This helps us prioritize features and documentation.
# For more information on what's sent, look at
# <https://github.com/grafana/loki/blob/main/pkg/analytics/stats.go>
# Refer to the buildReport method to see what goes into a report.
#
# If you would like to disable reporting, uncomment the following lines:
#analytics:
#  reporting_enabled: false

 



       ●  도커 컨테이너를 실행한다.
        👉  http://localhost:3100/ready에 접속하면 상태를 확인할 수 있다.

docker run --name loki -d -v ${loki-config.yml 이 저장된 폴더}:/mnt/config -p 3100:3100 grafana/loki:3.0.0 -config.file=/mnt/config/loki-config.yml

 

 

 

   ▶ 그라파나 설정 및 확인

       ●  사이드 메뉴의 Data sources 페이지에 접속하여 Add new data source 버튼을 클릭하고 Loki를 선택한다.



       ●  이름을 입력하고 커넥션에 Loki의 주소를 입력한다. Docker를 사용했기 때문에 host.docker.interal을 사용한다. Save & test를 클릭하여 상태를 확인하고 저장한다.

 

       ●  웹에서 루트 페이지에 접근하면 403 에러페이지가 발생합니다.

 

       ●   그라파나의 사이드 메뉴에서 Explore 페이지에 접근하여 Loki를 선택한다. 쿼리를 컨트롤러의 로그를 볼 수 있도록 수정한다.(이미지 확인) 페이지에 접속하고 Run query를 실행하면 해당 로그가 출력되는것을 확인할 수 있다. 

 

 

 

 

 

 

 


※ 위 이미지들은 스파르타코딩클럽에 저작권이 있으므로 무단 도용 금지 및 상업 목적으로 사용할

'모니터링' 카테고리의 다른 글

시큐어 코딩 - XSS  (2) 2024.10.11
시큐어 코딩 - CSRF  (9) 2024.10.11
시큐어 코딩 - CORS  (0) 2024.10.09
모니터링 - Prometheus와 Grafana  (0) 2024.10.04
모니터링 시스템  (2) 2024.10.02