코딩마을방범대
[ELK] ELK를 이용한 MySQL 로그 연동 방법 본문
위 포스터를 참고하여 ELK를 구축한 경우 여러 서비스의 로그를 수집할 수 있다.
이번 포스터에선 MySQL 로그와 연동해 볼 예정이다.
1. MySQL 환경 설정
우선 MySQL의 로그 설정이 필요하다.
1. MySQL conf 파일 수정
sudo vi /etc/mysql/my.cnf
위 명령어를 실행한 뒤 로그 출력을 세팅해주면 된다.
[mysqld]
# 일반적인 로그
general_log = 1
general_log_file = /var/log/mysql/mysql.log
# 에러 로그
log_error = /var/log/mysql/error.log
# 슬로우 쿼리 로그
slow_query_log = 1
slow_query_log_file = /var/log/mysql/mysql-slow.log
long_query_time = 2
설정명 | 설명 |
general_log | 일반 쿼리 로그를 활성화 |
general_log_file | 일반 로그 파일의 경로를 설정 |
log_error | 에러 로그 파일의 경로를 설정 |
slow_query_log | 슬로우 쿼리 로그를 활성화 |
slow_query_log_file | 슬로우 쿼리 로그 파일의 경로를 설정 |
long_query_time | 슬로우 쿼리로 간주할 쿼리 실행 시간을 설정 |
2. 디렉토리 권한 설정
MySQL이 로그를 쓸 수 있도록 /var/log/mysql/ 디렉토리를 생성하고 올바른 권한을 설정한다.
sudo mkdir -p /var/log/mysql
sudo chown mysql:mysql /var/log/mysql
sudo chmod 750 /var/log/mysql
3. MySQL 재시작 및 로그 확인
sudo systemctl restart mysql
ls -l /var/log/mysql/
2. Docker-compose 세팅하기
위 포스트를 참고하여 4번까지 세팅했다는 가정 하에 아래 단계들을 진행해주면 된다.
docker-compose.yml 파일을 수정해주면 된다.
logstash를 이용할 경우 logstash: depends_on에 mysql 추가 필수!
예시.
version: '3.8'
services:
elasticsearch:
image: elasticsearch:7.10.1
environment:
- discovery.type=single-node
ports:
- "9200:9200"
volumes:
- esdata:/usr/share/elasticsearch/data
logstash:
image: logstash:7.10.1
ports:
- "5044:5044"
volumes:
- ./logstash.conf:/usr/share/logstash/pipeline/logstash.conf
depends_on:
- elasticsearch
- mysql
kibana:
image: kibana:7.10.1
ports:
- "5601:5601"
depends_on:
- elasticsearch
mysql:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: root_password
MYSQL_DATABASE: your_database
MYSQL_USER: your_user
MYSQL_PASSWORD: your_password
ports:
- "3306:3306"
volumes:
- mysql_data:/var/lib/mysql
filebeat:
image: docker.elastic.co/beats/filebeat:7.10.1
volumes:
- ./filebeat.yml:/usr/share/filebeat/filebeat.yml
- /var/lib/docker/containers:/var/lib/docker/containers:ro
- /var/log:/var/log:ro
depends_on:
- mysql
- logstash
volumes:
esdata:
driver: local
mysql_data:
driver: local
이후에는 파일을 전송하는 방법에 따라 설정 방법이 다르다!
logstash를 활용하는 방법과 filebeat를 사용하는 방법이 있다.
filebeat는 경량 로그 데이터 수집가로, logstash와 다르게 세부적인 사항을 설정할 수 없다.
작은 프로젝트에서 사용하기 적합하므로, 웬만하면 Logstash 사용을 권고한다.
3. 데이터 전송 방법 선택하기
ⓐ Logstash 설정하기
logstash.conf 파일을 수정해주면 된다.
options | input example | 설명 |
jdbc_connection_string | jdbc:postgresql://localhost:5432/db | database 연결 정보를 입력하는 부분. 연결할 DB 정보에 맞게 입력 |
jdbc_user | user | database user 입력 |
jdbc_password | password | database password 입력 |
jdbc_driver_class | org.postgresql.Driver | driver class 입력 |
jdbc_driver_library | /usr/share/logstash/logstash-core/lib/jars/postgresql.jar | 4-2 에서 copy한 jar 경로 입력 사용 할 driver jar 의 경로가 입력되야함. |
statement | select * from table | 저장할 data query 입력 |
jdbc_paging_enabled | true | 페이징을 사용하여 데이터를 저장할 경우 사용 |
jdbc_page_size | 10000 | 페이지 사이즈 지정 |
jdbc_pool_timeout | 300 | jdbc timeout 지정 |
schedule | */1 * * * * | 스케쥴 지정 linux cron형식으로 스케쥴 지정 |
예시.
input {
jdbc {
jdbc_driver_library => "/usr/share/logstash/drivers/mysql-connector-java-8.0.23.jar" # MySQL JDBC 드라이버 경로
jdbc_driver_class => "com.mysql.cj.jdbc.Driver"
jdbc_connection_string => "jdbc:mysql://mysql:3306/your_database"
jdbc_user => "your_user"
jdbc_password => "your_password"
statement => "SELECT * FROM your_table"
schedule => "* * * * *" # 매 분마다 실행
}
}
output {
elasticsearch {
hosts => ["http://elasticsearch:9200"]
index => "your_index_name-%{+YYYY.MM.dd}"
}
}
ⓑ Filebeat 세팅하기
1. filebeat 설치 및 압축해제
curl -L -O https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.10.1-darwin-x86_64.tar.gz
tar xzvf filebeat-7.10.1-darwin-x86_64.tar.gz
cd filebeat-7.10.1-darwin-x86_64/
2. configuration 파일 수정
sudo vi filebeat.yml
위 명령어 실행 후 아래와 같이 ELK의 정보를 입력해주면 된다.
보통 기본 정보가 입력되어 있으나 주석 처리가 되어있기 때문에 주석 해제 후 알맞은 값을 기입해주면 된다.
username과 password는 따로 정해진 값이 없으니 원하는 아이디와 패스워드를 입력해주면 된다.
output.elasticsearch:
hosts: ["logstash:5044"]
username: "elastic"
password: "<password>"
setup.kibana:
host: "<kibana_url>"
3. filebeat의 mysql 설정 수정
cd modules.d/
vi mysql.yml
위 명령어는 sudo su 를 통해 root 권한을 받았을 때를 가정하여 실행한 것이다.
아까 위에서 설정한 MySQL 로그 출력 위치를 설정해주면 된다.
- module: mysql
# Error logs
error:
enabled: true
var.paths: ["/var/log/mysql/error.log"]
# Slow logs
slowlog:
enabled: true
var.paths: ["/var/log/mysql/mysql_slow.log"]
general:
enabled: true
var.paths: ["/var/log/mysql/mysql.log"] # 일반 로그 파일 경로
4. MySQL 모듈 활성화
cd ..
./filebeat modules enable mysql
5. filebeat 시작
./filebeat setup
./filebeat -e
4. ELK 시작하기
docker-compose build && docker-compose up -d
위 명령어를 실행한 후 kibana 홈페이지에 접속 후 확인해보면 된다.
참고사이트
'💡 백엔드 > ELK' 카테고리의 다른 글
[ELK] Docker로 ELK 스택 구축 시 실행 때마다 자동으로 사용자 설정하기 (0) | 2024.11.04 |
---|---|
[ELK] ELK에서 Logstash.conf 파일의 filter, input, output 블록 (0) | 2024.11.04 |
[ELK] ELK 역할 부여 및 권한 관리하는 방법 (0) | 2024.10.31 |
[ELK] 도커를 통해 ELK 구축한 후 Spring boot 로그와 연결하기 (0) | 2024.10.14 |
[ELK] ELK 스택(Elasticsearch, Kibana, Beats, Logstash) 개념 정리 (0) | 2024.08.29 |