모니터링 시스템
애플리케이션 로그 모니터링(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>
- Docker 로 Loki 실행
- 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: 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 컨테이너를 실행
- 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를 실행하면 해당 로그가 출력되는것을 확인할 수있습니다.