지난 글 (https://jammdev.tistory.com/284) 에서는 로그 모니터링 시스템의 Grafana 를 설치했다.
이번 글에서는 Loki 를 설치하고 Grafana 에 연동하는 과정을 정리해보겠다.
1. Loki 설치 및 환경설정
Grafana Loki 의 공식 문서를 참고하여 Loki 설치와 환경설정을 진행하려고 한다.
Loki 는 여러 컴포넌트들로 구성되어 있는 microservice architecture 를 가지고 있다. Loki 를 실행시킬 때 deployment mode 를 설정하여 시스템을 monolithic 하게 구성할 것인지, micro 하게 구성할 것인지 결정할 수 있다.
이 글에서는 아래 링크의 예제와 같이 simple scalable deployment 구조로 read, write, backend 서비스로 나누어 시스템을 구성해보겠다.
- Install Loki and collecting sample logs
- docker-compose.yaml
Loki 시스템을 Dpcker 기반으로 구성하려고 한다. docker-compose.yaml 을 통해서 Loki 서비스들을 구성했는데, 예제 docker-compose.yaml 에서 Loki 서비스인 read, write, backend 설정을 가져와서 작성했다. storage 는 minio 대신 local filesystem 을 사용하도록 수정했다.
# https://raw.githubusercontent.com/grafana/loki/main/examples/getting-started/docker-compose.yaml
services:
...
read:
image: grafana/loki:latest
container_name: loki-read
command: "-config.file=/etc/loki/config.yaml -target=read"
ports:
- 3101:3100
- 7946
- 9095
volumes:
- ./loki/loki-config.yaml:/etc/loki/config.yaml
healthcheck:
test: [ "CMD", "/usr/bin/loki", "-health" ]
start_period: 30s
interval: 10s
timeout: 5s
retries: 5
write:
image: grafana/loki:latest
container_name: loki-write
command: "-config.file=/etc/loki/config.yaml -target=write"
ports:
- 3102:3100
- 7946
- 9095
volumes:
- ./loki/loki-config.yaml:/etc/loki/config.yaml
healthcheck:
test: [ "CMD", "/usr/bin/loki", "-health" ]
start_period: 30s
interval: 10s
timeout: 5s
retries: 5
backend:
image: grafana/loki:latest
container_name: loki-backend
volumes:
- ./loki/loki-config.yaml:/etc/loki/config.yaml
ports:
- "3100"
- "7946"
command: "-config.file=/etc/loki/config.yaml -target=backend -legacy-read-mode=false"
healthcheck:
test: [ "CMD", "/usr/bin/loki", "-health" ]
start_period: 30s
interval: 30s
timeout: 10s
retries: 5
- loki-config.yaml
Loki 서비스의 설정은 loki-config.yaml 을 통해서 변경할 수 있다. Loki 시스템을 구성하는 각 컴포넌트들에 대한 설정을 포함하고 있는데, 이에 대한 자세한 내용은 추후에 정리해보겠다.
loki-config.yaml 은 예제 loki-config.yaml 파일의 내용에서 storage 설정 부분만 s3 대신 filesystem 을 사용하도록 변경하여 작성했다. 작성한 설정은 위 docker-compose.yaml 에서 확인할 수 있듯이 각 Docker 서비스에 volume 으로 마운트되어 적용할 것이다.
# https://raw.githubusercontent.com/grafana/loki/main/examples/getting-started/loki-config.yaml
auth_enabled: false
server:
http_listen_address: 0.0.0.0
http_listen_port: 3100
memberlist:
join_members: ["read", "write", "backend"]
dead_node_reclaim_time: 30s
gossip_to_dead_nodes_time: 15s
left_ingesters_timeout: 30s
bind_addr: ['0.0.0.0']
bind_port: 7946
gossip_interval: 2s
schema_config:
configs:
- from: 2023-01-01
store: tsdb
object_store: filesystem
schema: v13
index:
prefix: index_
period: 24h
common:
path_prefix: /loki
replication_factor: 1
compactor_address: http://backend:3100
storage:
filesystem:
chunks_directory: /loki/chunks
ring:
kvstore:
store: memberlist
ruler:
storage:
local:
directory: /loki/ruler
compactor:
working_directory: /tmp/compactor
- Loki 실행
Docker compose 를 통해 서비스들을 실행한 후 Docker 컨테이너 상태와 HTTP API 를 통해서 서비스가 정상적으로 동작하는지 확인할 수 있다.
Docker 프로세스를 확인하면 아래와 같이 컨테이너들이 동작중인 것을 확인할 수 있다.
loki-backend grafana/loki:latest "/usr/bin/loki -conf…" backend ...
loki-read grafana/loki:latest "/usr/bin/loki -conf…" read ...
loki-write grafana/loki:latest "/usr/bin/loki -conf…" write ...
read 서비스와 write 서비스가 각각 3101, 3102 포트에서 실행되고 있는데, GET /ready API 를 호출하여 서비스가 준비되었는지 확인할 수 있다. 정상적으로 실행된 경우 http://localhost:3101/ready 와 http://localhost:3102/ready 에 접속하면 `ready` 라는 응답이 오는 것을 확인할 수 있다.
2. Grafana 연동
Loki 의 설치가 다 되었다면 이제 Grafana 에서 Loki 를 연동하여 대시보드에 출력할 수 있다. 같은 Docker network 를 사용하는 것이 설정에 편하기 때문에, 지난 글에서 설정했던 Grafana 와 Loki 를 합쳐서 같은 Docker Compose 환경에서 실행한 후 Grafana 연동을 진행하겠다.
- Data source 추가
Loki 와 Grafana 를 연동하기 위해서는 Grafana 에 Data source 로 Loki 를 추가해줘야 한다.
Data source 는 Grafana 의 Connections/Add new connection 화면에서 진행할 수 있다. 현재 환경에서는 Grafana 가 3000 번 포트에서 동작하고 있기 때문에 http://localhost:3000/connections/add-new-connection 로 접속하면 된다.
Data source 에서 Loki 를 선택하고 name 과 Connection 의 URL 값을 지정해준다. 이때 Grafana 에서 로그를 읽어와야 하기 때문에 loki-read 서비의 주소로 URL 을 지정해주면 된다. 현재 Docker 환경에서는 Grafana 가 호스트가 아닌 컨테이너 내부에서 접근하기 때문에 http://localhost:3101 이 아닌 http://loki-read:3100 으로 지정해주면 된다.
설정을 다 해주고 하단의 Save & test 버튼을 클릭해주면 Data source successfully connected. 가 출력되는 것을 확인할 수 있다.
- Dashboard 추가
Data source 추가가 완료되면 Dashboard 에서 해당 Loki Data source 를 추가할 수 있다.
Dashboard 를 생성한 후에 panel 에서 쿼리를 주어 로그를 출력할 수 있는데, 아직 Loki 에 아무런 로그도 쌓여있지 않기 때문에 Data source 를 연결해도 출력할 값이 없다. 테스트를 위해서 Loki push API 를 호출하여 가짜 로그를 넣어보겠다.
아래와 같이 loki-write (localhost:3102) 의 POST /loki/api/v1/push API 를 호출하여 가짜 로그를 저장했다.
$ curl -X POST "http://localhost:3102/loki/api/v1/push" \
-H "Content-Type: application/json" \
-d '{
"streams": [
{
"stream": {
"app": "test-app",
"env": "local"
},
"values": [
["'"$(date +%s%N)"'", "hello loki test log"]
]
}
]
}'
API 를 호출하여 로그를 저장하고 나면 Grafana 에서 query 를 통해 Loki 에 저장된 로그를 조회할 수 있다. GUI 의 label filters 에서 `app = test-app` 을 지정하거나 Code 에서 `{app="test-app"}` 로 설정해주면 화면에 로그가 출력되는 것을 확인할 수 있다.
[Reference]
Quickstart to run Loki locally | Grafana Loki documentation
Quickstart to run Loki locally If you want to experiment with Loki, you can run Loki locally using the Docker Compose file that ships with Loki. It runs Loki in the simple scalable deployment mode and includes a sample application to generate logs. The Doc
grafana.com
'기타' 카테고리의 다른 글
| [로그 모니터링] Grafana Alerting (0) | 2026.03.19 |
|---|---|
| [로그 모니터링] Fluent Bit 설치와 시스템 연동 (0) | 2026.03.14 |
| [로그 모니터링] Garafana 설치 (0) | 2026.03.06 |
| [로그 모니터링] Fluent-bit + Loki + Grafana 로그 모니터링 시스템 (0) | 2026.02.28 |
| [RabbitMQ] RabbitMQ 개념 설명 (0) | 2025.05.13 |