[Logstash] GCS에서 BigQuery로 로그를 가져오는 방법
개시하다
일상적인 데이터 가공으로 Elastic사의 Logistash[1]를 사용하는 사람
약간의 데이터 가공과 인출을 할 때 Logistash에 의존하기 쉽습니다^^;
최적의 아키텍처의 의미는 이해하기에 더 좋은 방법이 있지만
때로는 익숙한 도구에 의존하기도 한다(웃음)
하고 싶은 일
이번에는 Google Cloud Storage에 저장될 CSV 형식의 로그 데이터입니다.
BigQuery(이후, BQ)를 가져오고 날짜를 포맷하기를 원합니다.
그래서 로고 스태시로 이루기로 했습니다.
이번 도전.
다음 플러그인을 사용하여 데이터를 얻습니다.
운영 환경
Product
version
Logstash
7.11.2
Open JDK
11.0.10
OS
CentOS 7.7
BigQuery
2021년 3월 18일 기준
Cloud Storage
2021년 3월 18일 기준
Region
asia-northeast1
【구성도】
[전제조건]
・GCP 콘솔 작업은 소유자 권한에 의해 수행됩니다.
·GCS의 통(log-bucket)이 제작되었습니다.
・ 로그 저장 경로는
log-bucket/LogData/20210318/testlog.gz
입니다.· BQ의 시계(log-table)가 제작되었습니다.
・ 테이블의 전체 경로는
test-project.dev_dataset.log-table
입니다.구현 단계
1. 서비스 계정 만들기
Cloud Shell을 시작합니다.
다음 명령을 사용하여 서비스 계정
for-logstash
을 만듭니다.$ gcloud iam service-accounts create for-logstash \
--display-name="for-logstash"
다음 명령을 사용하여 서비스 계정에 다음과 같은 역할을 분배한다.• 스토리지 객체 관리자
• BigQuery 데이터 편집
• BigQuery 작업 사용자
$ gcloud projects add-iam-policy-binding test-project \
--member="serviceAccount:[email protected]" \
--role="roles/storage.objectAdmin"
$ gcloud projects add-iam-policy-binding test-project \
--member="serviceAccount:[email protected]" \
--role="roles/bigquery.dataEditor"
$ gcloud projects add-iam-policy-binding test-project \
--member="serviceAccount:[email protected]" \
--role="roles/bigquery.jobUser"
logstash-vm에서 만든 서비스 계정을 지정합니다.$ gcloud compute instances set-service-account logstash-vm \
--service-account [email protected]
2. OpenJDK 설치
GCP 콘솔에서 브라우저 창에서logstash-vm로 로그인합니다.
다음 명령을 사용하여 OpenJDK를 설치합니다.
$ sudo yum install java-11-openjdk-devel
다음 명령을 사용하여 설치를 확인합니다.$ sudo java -version
openjdk version "11.0.10" 2021-01-19 LTS
OpenJDK Runtime Environment 18.9 (build 11.0.10+9-LTS)
OpenJDK 64-Bit Server VM 18.9 (build 11.0.10+9-LTS, mixed mode, sharing)
3. 창고 등록
다음 명령을 사용하여 Elastic 저장소를 등록합니다.
logstash.repo
, 이름 모두 가능$ sudo vi /etc/yum.repos.d/logstash.repo
상술한 문서에 기재된 내용은 다음과 같다.[logstash-7.x]
name=Elastic repository for 7.x packages
baseurl=https://artifacts.elastic.co/packages/7.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md
【참고】・Installing Logstash
4. Logstash 설치
다음 명령을 사용하여 PGP 키 파일을 가져오고yum 명령으로 Logstash를 설치합니다.
$ sudo rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch
$ sudo yum install logstash
다음 명령을 사용하여 설치를 확인합니다.$ sudo yum list installed | grep logstash
logstash.x86_64 1:7.11.2-1 @logstash-7.x
다음 명령을 사용하여 자동 시작 설정과 상태를 확인합니다.$ sudo systemctl daemon-reload
$ sudo systemctl enable logstash
$ sudo systemctl status logstash
5. 플러그인 설치
다음 명령을 사용하여 두 개의 플러그인을 설치합니다.
Installation successful로 표시되면 OK입니다.
$ sudo /usr/share/logstash/bin/logstash-plugin install logstash-input-google_cloud_storage
Validating logstash-input-google_cloud_storage
Installing logstash-input-google_cloud_storage
Installation successful
$ sudo /usr/share/logstash/bin/logstash-plugin install logstash-output-google_bigquery
Validating logstash-output-google_bigquery
Installing logstash-output-google_bigquery
Installation successful
다음 명령을 사용하여 설치를 확인합니다.$ /usr/share/logstash/bin/logstash-plugin list logstash-input-google_cloud_storage
logstash-input-google_cloud_storage
$ /usr/share/logstash/bin/logstash-plugin list logstash-output-google_bigquery
logstash-output-google_bigquery
6. 로그 데이터 및 테이블 모드
GCS에서 구성된 로그 데이터는 다음과 같습니다.
[로그 형식]
"colums1","colums2","colums3","colums4","time_stamp"
【로그 샘플】"data1","data2","data3","data4","2021/03/18 01:12:42"
대상 BQ를 저장하는 테이블 모드는 다음과 같습니다.필드 이름
타입
패턴
colums1
STRING
NULLABLE
colums2
STRING
NULLABLE
colums3
STRING
NULLABLE
colums4
STRING
NULLABLE
time_stamp
TIMESTAMP
NULLABLE
7. 파이프라인 정의 파일의 설정
파이프라인 정의 파일(logstash.conf)을 설정합니다.
$ sudo vi /etc/logstash/conf.d/logstash.conf
logstash.conf에 기록됩니다.logstash.conf
input {
google_cloud_storage {
# GCSを見にいく間隔(秒)
interval => 60
# GCSのバケット名
bucket_id => "test-bucket"
# 取込むファイル名
file_matches => "LogData/20210318/testlog.*.gz"
# プレーンテキストとして読込む
codec => "plain"
}
}
filter {
csv {
# CSVのヘッダー情報
columns =>
[
"colums1",
"colums2",
"colums3",
"colums4",
"time_stamp"
]
}
date {
# 日付型としてマッチする
match => ["time_stamp", "yyyy/MM/dd HH:mm:ss"]
# タイムゾーン指定
timezone => "Asia/Tokyo"
}
}
output {
# BQに出力
google_bigquery {
# GCPのプロジェクト名
project_id => "test-project"
# 出力したいBQのデータセット名
dataset => "dev_dataset"
# BQに取り込みたいフィールド名と型を指定
csv_schema => "colums1:STRING,colums2:STRING,colums3:STRING,colums4:STRING,time_stamp:TIMESTAMP"
# テーブル名を指定
table_prefix => "log-table"
# テーブル名につく接続文字を消す
table_separator => ""
# テーブル名の後に付く日付フォーマットを消すことにより日付できない。
date_pattern => ""
# エラー時に出力されるファイルのディレクトリ名
error_directory => "/tmp/bigquery-errors"
# テーブルスキーマと一致しない余分な列値を無視する
ignore_unknown_values => true
}
}
[설정된 해설]・이번에 인출할 서류는
testlog.gz
,testlog.01.gz
도 인출할 수 있습니다.시간stamp 필드의 날짜 형식을 ISO8601로 변환하기 위해date Filter를 사용합니다.
· 시간대에 아시아/Tokyo를 지정함으로써 UTC 시간으로 BQ에 저장한다.
· BQ에 대한 기본 출력은 테이블 이름
TablePrefix_%Y-%m-%dT%H:00
으로 설정됩니다.・표 이름만 지정할 때
table_separator
및 date_pattern
는 공백입니다.• 파티션 분할 테이블은 작성된 BQ 테이블에 저장할 때 사용할 수 있습니다.
・이번엔 분할표를 미리 만들어 BQ 출력으로 보관한다.
・ 로그 데이터 필드에서 테이블에 저장되지 않은 필드는
remove field
에서 삭제됩니다.·
ignore_unknown_values
는 진짜이며 가져오지 않을 수도 있다.로그 BQ 출력에서 테이블을 만들려면 파티션 분할 테이블로 사용할 수 없습니다.
또 Logistash에서도 BQ에 저장된 데이터를 중복 제거하는 메커니즘이 이뤄지지 않았다.
Logstash 가져오기 시 자동 새김
@timestamp
은 BQ로 출력할 때 "@"을 제거하고 Insert를 실행하는 동작입니다.따라서 다른 timestamp
나 TimeStamp
등 (대소문자 구분 없음) 필드가 있다면 @timestamp
시간에 임의로 덮어쓰일 수 있으니 주의하세요!8. 데이터 획득 확인
Logstash에 따라 BQ에 저장된 데이터는 스트리밍 형식으로 가져옵니다.
따라서 저장 후 즉시 아래 상태로 들어간다.
(최대 90분 후 테이블에 저장)
총결산
그럼, 어때요?
지속적인 활용을 시야에 두고 관리 서비스에 보내는 방법도 많다고 생각합니다.
특히 데이터 가공 없이 BQ에만 액세스할 경우 BigQuery Data Transfer Service[4]
데이터 가공도 GUI의 코드가 없는 것으로 하면 클라우드 데이터 퓨전[5]도 가능하다.
자신의 요구에 부합되는 방법으로 다양한 데이터 공학을 즐겨라!!
각주
로그 ↩︎
Google Cloud Storage Input Plugin ↩︎
Google BigQuery output plugin ↩︎
BigQuery Data Transfer Service 개요 ↩︎
Cloud Data Fusion ↩︎
Reference
이 문제에 관하여([Logstash] GCS에서 BigQuery로 로그를 가져오는 방법), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://zenn.dev/hssh2_bin/articles/5e97874277cf41텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)