이전에는 로그를 보기 위해서는 서버에 직접 접속하여 로그가 저장된 경로를 찾아가 일별로 저장돼있는 로그 파일들을 직접 조회했다.
많이 귀찮다 할 정도는 아니지만 로그를 볼 때마다 이러고 있으면 불편함을 느낀다.
그리고 터미널로 보고 있다보면 눈 꽤나 아프다.
그래서 로그 수집 환경을 구성하기로 했고 두 가지 기술스택을 고려했다. ELK와 Loki이다.
ELK
Loki
이런 차이가 있고 나는 Loki를 선택했다. 이유는 다음과 같다.
그래서 Promtail을 활용해 Loki를 적용시켰다.
yaml 파일 하나로 설정을 끝낼 수 있어 편리하다. 다음과 같이 설정했고 본인의 상황에 맞게 설정 파일을 바꾸면 된다. 모든 변수에 대한 설명은 Loki Configuration 에 있다.
server:
http_listen_port: 3100 # Loki API 포트
grpc_listen_port: 0 # gRPC 포트 (필요 없으면 0으로 설정)
ingester:
lifecycler:
ring:
kvstore:
store: inmemory
replication_factor: 1
chunk_idle_period: 5m
chunk_retain_period: 30s
max_transfer_retries: 0
schema_config:
configs:
- from: 2025-01-01
store: boltdb-shipper
object_store: filesystem
schema: v12
index:
prefix: index_
period: 24h
storage_config:
boltdb_shipper:
active_index_directory: /var/lib/loki/index
cache_location: /var/lib/loki/index_cache
shared_store: filesystem
filesystem:
directory: /var/lib/loki/chunks
limits_config:
enforce_metric_name: false
reject_old_samples: true
reject_old_samples_max_age: 168h
chunk_store_config:
max_look_back_period: 0s
table_manager:
retention_deletes_enabled: false
retention_period: 0s
compactor:
working_directory: /var/lib/loki/compactor
compaction_interval: 5m
retention_enabled: true
ruler:
storage:
type: local
local:
directory: /var/lib/loki/rules
rule_path: /var/lib/loki/rules-temp
alertmanager_url: ""
ring:
kvstore:
store: inmemory
enable_api: true
이걸 그대로 사용해도 문제 없을 것이다.
실행시키기 편하게 loki service를 등록시켜놓자.
[Unit]
Description=Loki Log Aggregation System
After=network.target
[Service]
User=root
Group=root
ExecStart=/usr/local/bin/loki -config.file=/etc/loki/loki-config.yml
Restart=always
RestartSec=5
LimitNOFILE=65536
[Install]
WantedBy=multi-user.target
이후에 systemctl loki start
, systemctl loki status
로 실행 시킨 뒤 상태 체크를 해본다.
위와 같이 active가 뜨고 밑에는 Loki 로그가 쭉 보여야 실행 완료다!
이제 Loki를 실행시켰으니 Loki로 로그를 전송시킬 수 있게 Promtail을 설정해야 한다.
Promtail은 간단히 말해서 로그 수집기다. 로그를 수집하고 Loki에 전송하는 역할을 한다.
단점이라고 한다면 Loki 전용이라는 것이지만 yml 파일 하나로 설정이 끝나서 설정이 편리하다는 큰 장점이 있다.
아래와 같이 설정한다.
/etc/promtail/promtail-config.yaml
server:
http_listen_port: 9080 # Promtail HTTP 포트
grpc_listen_port: 0 # gRPC 비활성화
positions:
filename: /var/lib/promtail/positions.yaml # 로그 읽은 위치 저장 파일
clients:
- url: http://[Loki 서버 IP]:3100/loki/api/v1/push # Loki 서버 주소 (Loki가 같은 서버라면 localhost)
scrape_configs:
- job_name: "pokit-info"
static_configs:
- targets:
- localhost
labels:
job: "pokit-info-logs"
__path__: "/var/log/pokit/info/*.log" # info 폴더 안의 모든 .log 파일
- job_name: "pokit-error"
static_configs:
- targets:
- localhost
labels:
job: "pokit-error-logs"
__path__: "/var/log/pokit/error/*.log" # error 폴더 안의 모든 .log 파일
Promtail은 9080포트를 사용한다.
positions는 promtail이 로그를 어디까지 읽었는 지, 그 위치를 저장하기 위해 필요하다.
clients는 로그를 보낼 주소를 넣는다. Loki가 Promtail이 돌아가는 서버와 같은 서버라면 로컬호스트지만 나의 경우엔 모니터링 서버가 따로 있어 해당 IP주소를 기입해주었다. Loki 주소 포트는 3100을 사용한다.
이제 scrape_config에서 job을 구성한다.
자유롭게 설정하면 되고 나는 info 로그와 warn/error 로그, 이렇게 두개의 label을 정했다.
후에 Loki 대시보드를 구성할 때 위와 같이 설정한다면 job_name을 통해 대시보드를 구성할 수 있다.
label을 구성할 때 path에는 보낼 로그가 저장돼있는 경로를 넣는다. 이러면 설정이 끝이다!
간단하게 실행시킬 수 있도록 promtail 서비스도 등록해놓자.
[Unit]
Description=Promtail Service
After=network.target
[Service]
User=root
Group=root
ExecStart=/usr/local/bin/promtail -config.file=/etc/promtail/promtail-config.yml
Restart=always
RestartSec=5
LimitNOFILE=65536
[Install]
WantedBy=multi-user.target
systemctl start promtail
를 실행하고 systemctl status promtail
로 상태 체크를 해보면
위와 같이 뜨고 promtail 로그가 밑에 쭉 떠야한다!
만약 Loki가 실행되고 있지 않거나 전송에 실패한다면 warn이나 error로그로 전송에 실패했거나 connection refused 로그가 뜰 것이다.
그라파나에서 Data Source를 추가해야한다. Loki를 선택하고 Loki 실행 주소를 기입한다.
나같은 경우는 모니터링 서버에서 Loki를 실행시켰으므로 localhost와 3100 포트를 넣는다.
그럼 이렇게 추가됨!
옆에 Explore를 누르고 대시보드를 구성할 수 있다.
Label filter를 고를 수도 있고 파일을 직접 고를 수도 있다. 대시보드를 구성하게 되면 최종적으로
이런 결과를 얻을 수 있다. 이제 편하게 Grafana에 들어와서 로그를 볼 수 있다!
비교적 간단한 작업을 통해 로그 수집 환경을 구성할 수 있었다.
적용 이후에 로그를 조회하는데 있어서 매우 편리함을 느끼고 있지만 언젠가 불편함을 느낄 수도 있을 것 같다.
로그 분석이 필요해지거나 시각화가 필요해지면 Loki로는 한계가 있을 것이다.
현재 ELK를 공부중이기 때문에 필요성을 느낀다면 바로 바꿀 수 있도록 할 예정이다.
화이팅!