Grafana loki란❓
Grafana Loki는 Grafana Labs에서 개발한 오픈 소스 프로젝트로, 로그 데이터 집계 시스템입니다.
Loki는 Prometheus의 메트릭 수집 방식과 유사하게 주로 로그 데이터를 수집하고 저장하며, Grafana와의 원활한 통합을 통해 강력한 시각화와 분석 기능을 제공합니다.
Grafana loki 특징
간단한 설계
- Loki는 로그 데이터를 효율적으로 처리하기 위해 간단한 구조를 채택하고 있습니다.
- 데이터 저장과 검색은 메타데이터와 로그 스트림에 기반하며, 실제 로그 내용은 압축된 형태로 저장됩니다. 이러한 접근은 관리와 유지보수를 용이하게 만듭니다.
Label 기반 저장
- 로그 데이터는 라벨 구분되어 저장됩니다.
- 이를 통해 다양한 쿼리와 필터링이 가능하며, 필요한 로그를 빠르게 찾을 수 있습니다. 레이블을 사용하면 로그의 메타데이터를 기반으로 상세한 검색과 분석이 가능합니다.
저렴한 비용
- Loki는 효율적인 데이터 저장 방식으로 저장 비용을 절감합니다.
- 로그 데이터를 압축하고 메타데이터를 활용하여 저장하므로 대규모 로그 데이터를 저렴하게 처리할 수 있습니다.
Grafana와의 통합
- Loki는 Grafana와의 원활한 통합으로 유명합니다.
- Grafana는 강력한 시각화 도구를 제공하며, Loki를 통해 수집된 로그 데이터를 대시보드에서 시각적으로 분석하고 모니터링할 수 있습니다.
확장성
- Loki는 분산 시스템으로 설계되어 있어 수평 확장이 가능하며, 대규모 로그 데이터를 효율적으로 처리할 수 있습니다.
loki-logback-appender
loki-logback-appender는 Logback을 사용하여 로그 데이터를 Grafana Loki에 전송할 수 있도록 도와주는 라이브러리입니다.
Logback은 자바 기반의 로깅 프레임워크로, 로그 데이터를 다양한 출력 형식으로 처리할 수 있습니다. loki-logback-appender는 Logback과 Loki를 연결하여, 자바 애플리케이션의 로그를 Loki로 직접 전송할 수 있게 합니다.
loki-logback-appender특징
Loki 통합
- loki-logback-appender는 Logback의 로그를 Grafana Loki로 직접 전송할 수 있도록 합니다.
- 이를 통해 로그 데이터를 중앙 집중화하고, Grafana에서의 시각화와 분석을 통해 더 효율적인 모니터링을 가능하게 합니다.
- 직접 전송하기 때문에
Promtail과 같은 별도의 로그 수집기를 사용하는 대신, logback에서 로그를 직접 전송할 수 있게 합니다.
간편한 설정
- loki-logback-appender를 사용하면 Logback의 설정 파일(logback.xml)에서 Loki와의 연결을 간편하게 설정할 수 있습니다.
- 별도의 복잡한 코드 작성 없이도 로그를 Loki로 전송할 수 있어 설정이 간편합니다.
Label 지원
- loki-logback-appender는 로그를 전송할 때 라벨(Label)을 사용할 수 있는 기능을 제공합니다.
- 레이블을 사용하면 로그를 다양한 기준으로 분류하고, 검색 및 필터링을 더 효과적으로 수행할 수 있습니다.
비동기 전송
- 로그 데이터를 비동기적으로 전송하여 애플리케이션의 성능에 미치는 영향을 최소화할 수 있습니다.
Promtail ❓
Grafana Loki와 함께 사용되는 로그 수집기 도구입니다.
Grafana loki 설정 (Spring boot)
1. 의존성 추가(Gradle)
dependencies {
implementation 'com.github.loki4j:loki-logback-appender:1.5.1' //추가
}
2. Logback 설정
<configuration>
<!-- Loki로 로그를 전송하는 Appender 설정 -->
<appender name="LOKI" class="com.github.loki4j.logback.Loki4jAppender">
<!-- Loki API URL 설정 -->
<http>
<url>http://localhost:3100/loki/api/v1/push</url>
</http>
<!-- 로그 포맷과 레이블 설정 -->
<format>
<!-- 로그에 레이블 추가 -->
<label>
<pattern>app=my-app,host=${HOSTNAME}</pattern>
</label>
<!-- 로그 메시지를 JSON 형식으로 포맷 -->
<message class="com.github.loki4j.logback.JsonLayout" />
</format>
</appender>
<!-- 루트 로거 설정 -->
<root level="DEBUG">
<!-- "LOKI" Appender를 루트 로거에 연결 -->
<appender-ref ref="LOKI" />
</root>
</configuration>
loki 동작 확인
1. 로그 발생 컨트롤러 생성
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;
}
}
로그를 생성해야 로그 수집이 가능하므로, 애플리케이션에서 로그를 작성해야 합니다. 로그가 생성되면, LokiAppender를 사용하여 이 로그를 Loki로 전달할 수 있습니다.
2. Config 파일 설정(for Dokcer)
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
도커에서 Grafana Loki를 실행할 때 사용하는 loki-config.yaml 파일은 Loki의 구성 및 설정을 정의하는 파일입니다. 이 파일은 도커 컨테이너에서 Loki를 실행할 때 컨테이너가 어떻게 동작할지를 결정합니다.
참고 자료
자세한 설치 및 설정 방법은 Grafana의 공식 문서를 참조하세요 : https://grafana.com/docs/loki/latest/setup/install/docker/
3. loki 컨테이너 실행
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
현재 config파일이 있는 위치를 명령어에 추가하면 다음과 같습니다.
docker run --name loki -d \
-v /Users/zinu/Dev/monitor/loki:/mnt/config \
-p 3100:3100 \
grafana/loki:3.0.0 \
-config.file=/mnt/config/loki-config.yml
docker를 실행 후 docker ps 명령어로 현재 실행중인 컨테이너를 확인하면 다음과 같이 정상적으로 컨테이너가 실행된 것을 확인할 수 있습니다.
4. loki 접속
시간이 조금 걸리기 때문에 위와같이 not ready였다가 새로고침을하면 다음과 같이 ready로 변하게 됩니다.
5. 에러 발생 확인
루트 페이지 (/)로 접속하면 미리 설정된 API에 따라 403 Forbidden 에러가 발생하는 것을 확인할 수 있습니다.
이는 SampleController에서 설정한 대로 접근 권한이 없을 때 403 에러를 반환하도록 되어 있기 때문입니다.
6. Loki 데이터 소스 추가 및 로그 검색 설정
- 데이터 소스 추가
- Prometheus를 통해 오는
로그가 아니므로, Grafana에서 Loki를 데이터 소스로 추가해야 합니다. - 사이드 메뉴에서 "Data Sources" 페이지로 이동합니다.
- "Add new data source" 버튼을 클릭한 후, Loki를 선택합니다.
- 이름을 입력하고, Loki의 주소를 커넥션 필드에 입력합니다.
- Docker를 사용하고 있으므로, 주소는 http://host.docker.internal:3100으로 설정합니다.
- "Save & Test" 버튼을 클릭하여 연결 상태를 확인한 후, 저장합니다.
- Prometheus를 통해 오는
- 로그 검색 설정
- 로그를 출력할 때 log.info를 사용했으므로, 로그 검색에서 "Line contains" 필드에 "INFO"를 입력합니다.
- 결과 확인
- 설정이 완료되면, Grafana 대시보드에서 Loki 앱을 사용하여 INFO와 SampleController 문자열을 포함하는 로그를 검색하고 시각화할 수 있습니다.
7. Grafana에서 Loki 로그 확인하기
그라파나의 사이드 메뉴에서 Explore 페이지에 접근하여 Loki를 선택합니다.
에러를 발생시키는 루트 페이지 (/)로 접속하여 에러를 발생시키고 Run query를 실행하면 해당 로그가 출력되는것을 확인할 수있습니다.
위와 같이 애플리케이션에서 발생한 로그를 확인할 수 있습니다. 이 방법을 통해 함수 단에서 발생한 로그를 Grafana에서 직접 모니터링하고 분석할 수 있습니다.
'Monitoring' 카테고리의 다른 글
[Grafana] Grafana와 Slack 연동하여 Alert 설정하기 (0) | 2024.08.19 |
---|---|
[Grafana] Prometheus와 Grafana로 데이터 시각화하기: Docker 환경에서의 설정 및 대시보드 작성 (0) | 2024.08.19 |
[Prometheus] Prometheus란 무엇일까❓(Spring Boot 애플리케이션의 메트릭 모니터링) (0) | 2024.08.19 |