이번에 NCUC 4회차 밋업에서 발표자로 참여하게 되었다! 커뮤니티 자체가 처음인데 발표자로 서게 되니 정말... 부담스럽고.. 어려웠지만 다들 좋은 말씀해주셔서 너무 감사하고 유익한 시간이었다ㅎㅎ
로깅에 대해서 전혀 몰라서 이번 기회에 로깅 서비스 사용 후기를 주제로 잡았는데, 아무래도 로깅을 어떻게 설정하는지에 대해 배경 지식이 전혀 없다보니 막막함+반복되는 삽질로 결국 어느정도의 간단한 세팅을 마칠 수 있었다ㅠㅠ
나와 비슷한 상황인 초보자에게 어느정도 가이드가 될 수 있도록 설정을 공유해보고자 한다 😊
사용 기술
- spring boot(gradle), Java 11
- Logback
- Effective Log Search & Analytics
🔽 동작 방식을 간단하게 설명해보면....
1. spring boot 프로젝트 생성
spring boot 버전 : 2.7.14
java 버전 : 11
의존성 추가 :
//Spring MVC를 사용한 RESTful서비스를 개발하는데 사용
implementation 'org.springframework.boot:spring-boot-starter-web'
설정 간소화를 위해 위의 의존성을 추가해준다.
2. Logback SDK 다운로드
가이드문서에서 nelo2-java-sdk-logback 버전을 다운로드한다.
다운로드한 zip파일에 nelo2-java-sdk-logback-버전 폴더와 __MACOSX 폴더가 보이는데, nelo2-java-sdk-logback-버전 폴더에 있는 두 개의 jar파일만 사용한다.
프로젝트 최상단에 libs폴더를 생성해서 아래에 두개의 jar파일을 옮겨준다.
3. build.gradle 파일 수정
가이드문서는 maven 기준으로 작성되어있지만 우리는 gradle을 사용하기 때문에 포맷 변경이 필요하다.
특히 가이드 문서 그대로 사용하게 되면 의존성으로 추가했던 starter-web과 logback,Jackson 설정이 중복되어 충돌하기 때문에 이 부분은 제외하고 아래와 같이 추가해준다.
// ELSA SDK 로컬 JAR 파일 설정
implementation files('libs/nelo2-java-sdk-core-1.6.6.jar')
implementation files('libs/nelo2-java-sdk-logback-1.6.6.jar')
// Logback Classic
implementation 'ch.qos.logback:logback-classic:1.2.12'
// Apache Thrift
implementation 'org.apache.thrift:libthrift:0.9.3'
s:httpclient:4.2.6'
// Apache HttpClient
implementation 'org.apache.httpcomponent
4. logback.xml 파일 작성
가이드에는 프로젝트 아이디를 작성하라고 써있는데 프로젝트 아이디는 고유값이 아니라서 내 ELSA 프로젝트의 주소를 찾을 수 없다. (이 때 이상함을 느꼈어야 한다.) Effective Log Search & Analytics 콘솔상에서는 프로젝트 아이디, 이름, 키 세가지를 확인할 수 있는데, 아이디가 아니라 키값을 넣으면 된다. 여기서 제일 헤맸는데 지금 생각해보면 어!처!구니가 없다🙉
<configuration>
<!-- NELO2 Appender 설정 -->
<!--ThriftAppender : 로그 메시지를 외부 시스템(여기서는 ELSA)으로 전송-->
<appender name="nelo" class="com.naver.nelo2.logback.ThriftAppender">
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>ERROR</level><!--기본값 : TRACE-->
</filter>
<param name="projectName" value="프로젝트 키"></param>
<param name="collectorUrl" value="elsa-col.ncloud.com"></param>
<param name="encoding" value="utf-8"></param>
<param name="timeout" value="1200"></param>
<param name="enable" value="true"></param>
<param name="debug" value="false"></param>
<param name="version" value="1.0.0"></param>
<param name="errorCodeType" value="default"></param>
<param name="port" value="10006"></param>
<param name="isBulkEnabled" value="true"></param>
</appender>
<!-- Logger : 특정 패키지 또는 클래스로부터 발생하는 로그를 처리-->
<logger name="com" additivity="false"><!-- com 패키지의 로그를 처리-->
<level value="debug"/>
<appender-ref ref="nelo"/>
</logger>
<!-- Root Logger -->
<root level="warn">
<appender-ref ref="nelo"/>
</root>
</configuration>
나는 ERROR 로그만 넘길 수 있도록 level 설정을 변경해주었다.
5. test api 작성
이제 잘 연결되었는지 확인을 위해 테스트 API를 작성해보자.
Null Pointer Exception을 발생시키는 코드를 아래와 같이 추가해준다.
@RestController
@RequestMapping("/api")
public class APIController {
private static final Logger logger = LoggerFactory.getLogger(APIController.class);
@GetMapping("/normal") // 이건 그냥 정상 확인용으로 추가함
public String normal() {
logger.info("Normal request received");
return "Normal Response";
}
@GetMapping("/nullPointer")
public String nullPointer() {
try {
String npe = null;
npe.toString();
} catch (NullPointerException e) {
logger.error("Null Pointer Exception occurred", e);
}
return "Null Pointer Exception Occurred";
}
}
6. 결과 확인
로컬에서 서버를 돌리는 경우에는 localhost:8080/api/nullPointer 경로로 접속한다.
Effective Log Search & Analytics Logback 콘솔 화면에서 다음과 같이 로그를 확인하면 성공적으로 세팅 완료!🎉
🗒️ 소스코드 참고
https://github.com/ty990520/NCP_ELSA_LOGBACK_SLACK
GitHub - ty990520/NCP_ELSA_LOGBACK_SLACK: Spring boot(gradle)로 네이버클라우드 Effective Log Search & Analytics Logback
Spring boot(gradle)로 네이버클라우드 Effective Log Search & Analytics Logback SDK 세팅 - GitHub - ty990520/NCP_ELSA_LOGBACK_SLACK: Spring boot(gradle)로 네이버클라우드 Effective Log Search & Analytics Logbac...
github.com
Logback sdk 설정 외에도 Slack 설정과 LogstashEncoder 설정이 함께 추가되어있어서 헷갈릴 수 있지만 코드 주석과 블로그에 적혀있는 내용을 위주로 살펴보면 잘 따라올 수 있을 것이다!
(Effective Log Search & Analytics Logback로 ERROR 로그가 들어오면 Slack 알림을 자동 전송하도록 하고 싶었는데... 기능을 지원하지 않아 결국 애플리케이션에서 웹훅url로 전송하도록 세팅할 수 밖에 없었다... Cloud Function 트리거... 만들어줘요....🥲)
'DevOps > Cloud' 카테고리의 다른 글
Event Driven Architecture는 왜 필요할까? (0) | 2021.12.28 |
---|---|
nohup 설정하기 (0) | 2021.06.30 |
[Linux] 포트포워딩 (0) | 2021.06.30 |
DB - 서버 연결 및 웹프로젝트 업로드 (Robo3T, FileZilla) (0) | 2021.06.30 |
git bash에서 EC2접속 및 서버 세팅하기(Window) (0) | 2021.06.30 |
댓글