모니터링 시스템

애플리케이션 로그 모니터링(Loki)

korea-wongi 2024. 8. 16. 23:03

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>

 

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: http://localhost:9093

# 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

 

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를 실행하면 해당 로그가 출력되는것을 확인할 수있습니다.