안녕하세요!
프뚜(프로그래머 뚜)입니다!
SpringBoot에서 API, AUTH, PORTAL log를 생성 후 출력합니다.
Logstash에서 생성된 로그 파일을 input으로 가져옵니다.
Logstash에서 가져온 로그를 filter를 통해 정리 후 ElasticSeach로 보냅니다.
Kibana에서 ElasticSearch 설정 및 UI를 제공합니다.
[개발 환경]
- OS: windows 10 64bit
- JAVA: 1.8
- ElasticSearch: 7.2.0
- Logstasg: 7.2.0
- Kibana: 7.2.0
1. SpringBoot > logback.xml 설정하기
// 2022.11.23[프뚜]: logback
implementation 'net.logstash.logback:logstash-logback-encoder:7.2'
build.gradle에 jar를 추가합니다.
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!-- 2022.11.25[프뚜] 파일 최대 용량 -->
<property name="MAX_FILE_SIZE" value="50MB"/>
<!-- 2022.11.25[프뚜] 파일 최대 저장일자 -->
<property name="MAX_HISTORY" value="7"/>
<!-- 2022.11.25[프뚜] 파일명 -->
<property name="API_LOG_PATH_NAME" value="c:/works/test/API.log"/>
<property name="AUTH_LOG_PATH_NAME" value="c:/works/test/AUTH.log"/>
<property name="PORTAL_LOG_PATH_NAME" value="c:/works/test/PORTAL.log"/>
<!-- 2022.11.25[프뚜] API -->
<appender name="api" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${API_LOG_PATH_NAME}</file>
<encoder class="net.logstash.logback.encoder.LogstashEncoder">
<provider class="net.logstash.logback.composite.loggingevent.ArgumentsJsonProvider"/>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${API_LOG_PATH_NAME}_%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<maxFileSize>${MAX_FILE_SIZE}</maxFileSize>
<maxHistory>${MAX_HISTORY}</maxHistory>
</rollingPolicy>
<layout class="ch.qos.logback.classic.PatternLayout">
<pattern>%d{yyyy-MM-dd HH:mm:ss} | %m%n</pattern>
</layout>
</appender>
<!-- 2022.11.25[프뚜] AUTH -->
<appender name="auth" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${AUTH_LOG_PATH_NAME}</file>
<encoder class="net.logstash.logback.encoder.LogstashEncoder">
<provider class="net.logstash.logback.composite.loggingevent.ArgumentsJsonProvider"/>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${AUTH_LOG_PATH_NAME}_%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<maxFileSize>${MAX_FILE_SIZE}</maxFileSize>
<maxHistory>${MAX_HISTORY}</maxHistory>
</rollingPolicy>
<layout class="ch.qos.logback.classic.PatternLayout">
<pattern>%d{yyyy-MM-dd HH:mm:ss} | %m%n</pattern>
</layout>
</appender>
<!-- 2022.11.25[프뚜] PORTAL -->
<appender name="portal" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${PORTAL_LOG_PATH_NAME}</file>
<encoder class="net.logstash.logback.encoder.LogstashEncoder">
<provider class="net.logstash.logback.composite.loggingevent.ArgumentsJsonProvider"/>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${PORTAL_LOG_PATH_NAME}_%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<maxFileSize>${MAX_FILE_SIZE}</maxFileSize>
<maxHistory>${MAX_HISTORY}</maxHistory>
</rollingPolicy>
<layout class="ch.qos.logback.classic.PatternLayout">
<pattern>%d{yyyy-MM-dd HH:mm:ss} | %m%n</pattern>
</layout>
</appender>
<!-- 2022.11.25[프뚜] tistory.petoo.api package -->
<logger name="tistory.petoo.api" level="INFO" additivity="false">
<appender-ref ref="api"/>
</logger>
<!-- 2022.11.25[프뚜] tistory.petoo.auth package -->
<logger name="tistory.petoo.auth" level="INFO" additivity="false">
<appender-ref ref="auth"/>
</logger>
<!-- 2022.11.25[프뚜] tistory.petoo.portal package -->
<logger name="tistory.petoo.portal" level="INFO" additivity="false">
<appender-ref ref="portal"/>
</logger>
</configuration>
./src/resources/logback.xml에 적용합니다.
logback에 설정되어있는 package 기준으로 class를 생성합니다.
new Thread(() -> {
while (true) {
try {
log.info("{\"id: \"1\", \"name\": \"api\"}");
Thread.sleep(2000);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}).start();
테스트 출력(json)을 합니다. (name 만 다를 뿐 api, auth, portal 내용 같습니다.)
2. Logstash, ElasticSearch, Kibana 다운로드 하기
WINDOWS를 클릭해서 다운로드 받습니다.
3. ElasticSearch 실행하기
[경로]/elasticsearch-7.2.0/bin/elasticsearch
실행 후 default port로 접속합니다. (http://127.0.0.1:9200)
4. Kibana 실행하기
[경로]/kibana-7.2.0-windows-x86_64/bin/kibana.bat
실행 후 default port로 접속합니다. (http://127.0.0.1:5601)
5. logstash 설정 및 실행하기
[경로]/logstash-7.2.0/config/pddo.conf
input {
file {
path => "C:/works/test/API.log"
type => api
}
file {
path => "C:/works/test/AUTH.log"
type => auth
}
file {
path => "C:/works/test/PORTAL.log"
type => portal
}
}
filter {
dissect {
mapping => {
"message" => "%{timestamp} | %{message}"
}
}
date {
match => ["timestamp", "ISO8601", "YYYY-MM-dd HH:mm:ss,SSS"]
}
json {
source => "message"
}
}
output {
if [type] == "api" {
elasticsearch {
codec => json
hosts => ["http://localhost:9200","http://127.0.0.1:9200"]
index => "api"
}
}
if [type] == "auth" {
elasticsearch {
codec => json
hosts => ["http://localhost:9200","http://127.0.0.1:9200"]
index => "auth"
}
}
if [type] == "portal" {
elasticsearch {
codec => json
hosts => ["http://localhost:9200","http://127.0.0.1:9200"]
index => "portal"
}
}
}
1. input에서 file을 읽어옵니다.
2. filter에서 읽어온 데이터를 정제합니다.
3. output에서 각 type에 맞는 데이터를 elasticesarch로 전달합니다.
[경로]/bin/logstash -f [경로]/config/pddo.conf
실행합니다.
자세한 내용은 소스코드를 통해 확인해보실 수 있습니다. (제목과 Git Comment는 같습니다.)
'프로그램 > JAVA' 카테고리의 다른 글
[JAVA] SpringBoot에서 JWT 설정 및 사용하기 (JJWT) (2) | 2022.12.27 |
---|---|
[SpringBoot] Redis에서 keys VS scan 사용하기 (keys 대신 scan) (3) | 2022.12.05 |
[SolrJ] spring boot + solrj 연동 및 사용하기 (0) | 2022.11.24 |
[Spring] Redis Jedis에서 Lettuce로 변경하기(Lettuce Config 세팅) (2) | 2022.11.17 |
[JPA] Spring boot JPA 연결 및 사용하기 (1) | 2022.10.30 |