※ [ Spring Boot ] 스프링부트, 로그를 파일로 저장하는 설정 켜기[ 서버 ] centOS7, 스프링부트, 로그를 파일로 저장 하는 설정 켜기
- 이유 : 개발용에서는 개발자가 콘솔로 오류를 바로바로 확인할 수 있지만
실무용에서는 사용자가 이용중에 발생한 오류를 개발자가 따로 확인할 수가 없다.
1. 개발용에서 쿼리를 실행하면 콘솔창에서 보여주게 하는 설정
- logback.xml 파일 정석 명칭 : logback-spring.xml
2. logback-spring.xml의 정석 파일명으로 수정해놓음.
3. logback-spring.xml의 내용을 기존코드에서 아래코드로 변경
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<springProperty name="LOG_PATH" source="custom.logging.dir" />
<!-- aplication.yml에 정의한 log level, dir 데이터를 정의합니다 -->
<springProperty name="LOG_LEVEL" source="custom.logging.level" />
<!--콘솔에 로그를 남깁니다. -->
<appender name="Console" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<Pattern>
%d{yyyy-MM-dd HH:mm:ss} [%thread] [%-5level] %logger{36} -
%msg%n
</Pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<!--파일에 로그를 남깁니다. -->
<appender name="File" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_PATH}/today_common.log</file>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<Pattern>%d{yyyy-MM-dd HH:mm:ss} [%-5level] %logger{36} - %msg%n
</Pattern>
<charset>UTF-8</charset>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_PATH}/daily_common/%d{yyyy-MM-dd}.log
</fileNamePattern>
<maxHistory>30</maxHistory>
</rollingPolicy>
</appender>
<!--파일에 로그를 남깁니다. (Roling) -->
<appender name="RollingFile" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_PATH}/archived/today_common.log</file>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<Pattern>%d{yyyy-MM-dd HH:mm:ss} [%-5level] %logger{36} - %msg%n
</Pattern>
<charset>UTF-8</charset>
</encoder>
<!-- 10MB가 넘어가면 새로운 압축파일이 생성 -->
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<MaxFileSize>10MB</MaxFileSize>
</triggeringPolicy>
<!-- 파일을 덮어쓰는 정책 -->
<rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
<FileNamePattern>${LOG_PATH}/archived/today_common.%i.log.zip
</FileNamePattern>
<!-- 10MB단위로 로그 압축 파일이 생성된다. (1 ~ 10) 10개가 넘어가면 오래된순으로 덮어쓰기 됩니다. -->
<MinIndex>1</MinIndex>
<MaxIndex>10</MaxIndex>
</rollingPolicy>
</appender>
<!--에러 일 경우 파일에 로그를 남깁니다 -->
<appender name="Error" class="ch.qos.logback.core.rolling.RollingFileAppender">
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>error</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<file>${LOG_PATH}/error.log</file>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<Pattern>
%d{yyyy-MM-dd HH:mm:ss} [%-5level] %logger{36} - %msg%n
</Pattern>
<charset>UTF-8</charset>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_PATH}/daily_error/%d{yyyy-MM-dd}.log
</fileNamePattern>
<maxHistory>30</maxHistory>
</rollingPolicy>
</appender>
<!-- org.springframework.web 패키지 아래에서 발생하는 INFO 레벨 로그를 Console, File에 남깁니다. root의 속성을 상속받지 않습니다. -->
<logger name="org.springframework.web" level="INFO" additivity="false">
<appender-ref ref="Console" />
<appender-ref ref="File" />
<appender-ref ref="Error" />
</logger>
<logger name="org.apache.ibatis" level="DEBUG" additivity="false">
<appender-ref ref="Console" />
<appender-ref ref="RollingFile" />
<appender-ref ref="Error" />
</logger>
<!-- DEBUG 레벨 로그를 Console, File, RollingFile에 남깁니다. ERROR 인 경우 bamdule-error.log에 남깁니다. -->
<root level="${LOG_LEVEL}">
<appender-ref ref="Console" />
<appender-ref ref="File" />
<appender-ref ref="Error" />
</root>
<logger name="jdbc" level="OFF" />
<logger name="jdbc.sqlonly" level="OFF" />
<logger name="jdbc.sqltiming" level="DEBUG" />
<logger name="jdbc.audit" level="OFF" />
<logger name="jdbc.resultset" level="OFF" />
<logger name="jdbc.resultsettable" level="DEBUG" />
<logger name="jdbc.connection" level="OFF" />
</configuration>
4. source를 name으로 사용하겠다.
5. application.yml 파일에 설정 변경
- 개발용과 실무용을 구분해서 입력해주어야 한다.
- dir(directory)이 다르다.
- level은 spring log level이라고 검색하면 level별로 얼마나 사소한것까지 출력할지
참조해서 level을 지정할 수 있다.
- level: DEBUG는 배포과정에서 속도가 현저히 떨어지는 문제가 있어서
level: info 로 나중에 수정을 해주었음. (10번 쯤에서)
6. workspace - project폴더 안에 들어가보면 존재하지 않았던 log폴더가 생성된 것을 볼 수 있다.
- application.xml에 custom(개발용, 실무용)을 입력하고, 저장한 순간 생긴듯.
- project를 실행
- 실행되지 않은 오류에 대해서 log폴더 - error.log 파일을 열어보면 오류 내용이 기재된 것을 볼 수 있다.
7. 개발용에서도 실행하는 모든 쿼리를 콘솔에 보여줄 뿐만 아니라 파일로 하나하나 다 저장을 한다.
- log폴더 - today_common.log 파일 안에
8. 서버에도 적용을 해주어야 한다.
※ 중간 중요한 TIP
cmd를 사용하지 않고 sts에서 바로 redeploy하는 방법 시작
1. 최초 한번은 Maven build를 해주어야 한다.
- project 우클릭
- Run As
- 4 Maven build 클릭
2.
- Name : project명 deploy
- Goals : tomcat7:redeploy
- 저장하고 Run
3. 배포가 잘 되었다.
4. 최초 이후 배포 방법
- Run As
- Run Configurations.... 클릭
- Maven Build를 보면 내가 만들어놓은 maven을 확인할 수 있다.
- 만약 동일한 프로젝트의 maven이 추가로 만들어졌다면 delete해주면 된다.
- 배포하려는 프로젝트 maven을 선택해서 Run을 눌러주면 cmd에 들어가지 않고
바로 배포를 할 수 있다.
- 테스트 결과 배포가 잘 된다.
- Run As - 4번의 maven build를 클릭해도 배포가 된다.
cmd를 사용하지 않고 sts에서 바로 redeploy하는 방법 끝
9. tmp폴더 안으로 이동 한다.
- cd /tmp 명령어 입력
- tmp폴더 안에는 누구나 들어갈 수 있다?? 누구나 쓸 수 있다?
- /tmp/pt명-log 폴더로 이동한다.
- cd /tmp/프로젝트명-log 명령어 입력
- 해당 폴더를 찾을 수 없다고 한다.
- sudo locate 프로젝트명-log 로 검색해도 검색되는게 없다.
10. 샘 실행 과정 (예시)
- tmp폴더 안에 이렇게 error.log, today_common.log 파일과 archived 폴더가 생겨야 하는데 생기지 않았었다.
- 나 또한 문제 해결.
- 문제의 원인 : 이전 작업 과정에서 기존 logback.xml 파일명을 정식 파일명으로 변경해준다고
- logback-spring.xml로 변경을 해주었었다.
- 해당 파일명을 다시 logback.xml로 변경을 해주고 배포를하고 tmp폴더 안에서 ls를 확인해본 결과
- 프로젝트명-log 폴더가 잘 생성된 것을 확인할 수 있다.
- 프로젝트-log 폴더가 tmp폴더 안에 만들어진 것은
- 우리가 application.yml에서 그렇게 지정을 했기 때문이다.
- 그리고 custom의 level을 info로 수정해주었다.
- 배포 과정에서 DEBUG level은 배포 속도가 현저히 느려서.
11. 샘이 application.yml에 dir을 /tmp로 수정하시고 테스트를 했었어서
- 다시 dir을 dir: /tmp/pt명-log으로 변경하셨음.
- today_common.log&error.log파일과 archived폴더는 pt명-log폴더 안에 만들어져야 하므로
- tmp폴더 안에 만들어진 것을 삭제하시는 과정임.
- rm -rf로 폴더, 파일들을 삭제하시는데 archived만 뒤에 /이 붙은 것을 확인할 수 있음.
- 폴더 뒤에는/를 붙여주는건가? 그런거....같음....
- apache-tomcat-9.0.37.tar.gz은 tomcat 압축본
- 압축을 풀으면 보라색?파란색으로 변한다. 이미 압축을 풀어놓음.
- 그래서 그럴까 압축파일을 삭제하셨음. 필요하지 않다고.
12. .gitignore파일에 2개 파일 추가해주기.
- 위는 샘 추가 화면
- 아래는 내 프로젝트 .gitignore 목록
- 샘 github 내용과 일치
bin/
HELP.md
target/
!.mvn/wrapper/maven-wrapper.jar
!**/src/main/**/target/
!**/src/test/**/target/
### STS ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
.sts4-cache
### IntelliJ IDEA ###
.idea
*.iws
*.iml
*.ipr
### NetBeans ###
/nbproject/private/
/nbbuild/
/dist/
/nbdist/
/.nb-gradle/
build/
!**/src/main/**/build/
!**/src/test/**/build/
### VS Code ###
.vscode/
log/
LOG_PATH_IS_UNDEFINED/
13. 프로젝트에 생긴 log, LOG_PATH_IS_UNDEFINED 폴더도 개발용은 지우고
- 프로젝트를 실행시키면 자동으로 폴더가 만들어진다.
- 필요에따라 지우고 사용
- 폴더가 생성되게 설정을 해놓았기 때문.
14. 시나리오 (서버용)
- 고객이 어젯밤 서비스를 사용하다가 문제가 발생했다고 한다.
- 어떻게 안되는지 물어봤으나 그냥 안됐다. 라는 말 밖에 들을 수가 없었다.
- 개발자인 나는 그 오류가 어떤 오류인지를 알아야 문제를 해결할 수 있다.
- 당장 나는 그 문제를 알 수가 없다..................
15. tmp에서 ls -alh 상세 리스트를 확인한다.
- ls - alh 명령어 입력
- 프로젝트명-log폴더의 소유권은 tomcat한테 있는 것을 확인할 수 있다.
- 그래서 마스터 계정으로 해당 폴더로 들어가려고 하면 들어갈 수가 없다.
16. 에러를 확인하기 위해 프로젝트명-log 폴더 안으로 접속해서 에러를 확인해야 한다.
- su 명령어 입력
- 마스터 계정에서 root계정으로 전환
- cd /tmp 명령어 입력
- root 계정의 tmp폴더로 이동
- cd 프로젝트명-log 명령어 입력
- ls 명령어 입력
- archived 폴더1개, error.log 파일1개, today_common.log 파일1개 확인 가능
- cat error.log 명령어 입력
- error내용을 볼 수 있다.
- 가상 시나리오로 아직 실무용에서 error를 입력받아 놓은게 없다.
- 아직 error가 없어서 조회 명령어를 입력해도 아무것도 나오지 않는 것.
17. 가정 : sudo systemctl stop mysql 명령어를 입력해서 service에 문제를 발생시킨다.
- 실수로 mysql을 꺼버렸다.
18. root 계정 접속
- tmp 폴더 안으로 이동
- pt명-log 폴더 안으로 이동
- cat error.log 명령어 입력
- 위와 같이 내가 프로그램을 개발하고 있지 않는 때의 오류 발생 시간, 원인등을 알 수 있어서
문제를 해결하는데 아주 큰 도움이 된다.
19. mysql 켜주기
- sudo systemctl start mysql 명령어 입력
- 테스트 중이던 root계정의 pt명-log 폴더 안에서 해당 명령어를 입력해주었음.
20. 테스트 종료
※ tmp 폴더는 주기적으로 지워진다. (알아서)
- 데이터를 굳이 쌓아둘 필요가 없다면 따로 저장해두지 않아도 된다.
- tmp폴더 안에 보관해도 크게 상관이 없다.
- 파일이 엄청나게 쌓여서 용량이 폭발할 일이 없다.
- 주기적으로 지워지기 때문에
- 그러나 로그를 30일 이전 또는 몇개월 전, 몇년 전의 로그를 모두 확인할 필요가 있겠다 싶으면
tmp폴더 안에 만들지 말고 다른 경로에 폴더를 만들어서 로그를 저장한다.
- 이렇게하면 내가 삭제하지 않는 이상 폴더, 파일이 계속 남아있는다. 쌓인다.
- tmp 폴더 안에 있는 데이터는 언젠가는 다 날라가기는 한다.
1. 현재 폴더 확인
- pwd 명령어 입력
- root계정으로 tmp안의 pt명-log 폴더안에 있다.
- tmp 폴더로 이동
- cd .. 명령어 입력
- 폴더 안의 파일 등 리스트 확인
- ls 명령어 입력
- tomcat 폴더로 이동
- cd /opt/tomcat/ 명령어 입력 (tmp폴더에서 사용)
- ls 명령어 입력
2. tomcat폴더에서 latest 폴더로 이동
- cd lastest/ 명령어 입력
3. 다시 tomcat 폴더로 돌아온다.
- tomcat 폴더 안에 site_logs 폴더 생성
- mkdir site_logs 명령어 입력
- tomcat 폴더에서 site_logs 폴더로 이동
- cd stie_logs/ 명령어 입력
- site_logs 폴더 리스트 조회
- ls 명령어 입력
- service 폴더 생성
- mkdir 서비스명 명령어 입력
- 다시 tomcat 폴더로 이동
- cd .. 명령어 입력
- tomcat 폴더의 상세한 리스트 조회
- ls -alh 명령어 입력
- tomcat 폴더 안에 site_logs 폴더가 생긴걸 확인할 수 있지만 root계정으로 만들었기 때문에
소유권이 root한테 있다.
- 소유권을 tomcat에 맞춰주는것이 좋다....
- 꼭 그래야만 하는 것은 아니지만 맞춰주는게 좋다....
4. 현재 tomcat 폴더 안에 있는지 확인한다.
- pwd 명령어 입력
- 현재 위치를 알려준다.
- site_logs/ 폴더의 소유권을 root에서 tomcat으로 변경해준다.
- chown tomcat:tomcat -R site_logs/ 명령어 입력
- site_logs/ 폴더로 이동
- cd site_logs/ 명령어 입력
- site_logs/ 폴더 리스트 확인 (site_logs폴더 안에 다른 폴더, 파일이 있는지 조회)
- ls 명령어 입력
- 아까 만들어두었던 서비스의 폴더가 조회된다.
- 서비스 폴더로 이동
- cd 폴더명/ 명령어 입력
- 현재 서비스 폴더로 제대로 잘 들어왔는지 확인한다.
- pwd 명령어 입력
- /opt/tomcat/site_logs/at 현재 디렉토리가 조회되는 것을 확인.
5. tomcat 폴더 안에 site_logs폴더를 만들었고
- site_logs폴더 안에 서비스 폴더를 만들어주었다.
- 최종 서비스 폴더의 디렉토리를 pwd 명령어를 입력해서 조회하고
- 그 디렉토리를 application.yml custom의 dir에 입력을 해주면
- log정보가 모두 지정한 디렉토리에 저장이 된다!
- 내가 삭제하지 않는한 log 정보가 무한히 쌓이며, 저장이 된다!
- log를 계속, 지속적으로 꾸준히 확인을 해야한다면 아주 유용한 데이터 관리 방법이다.
6. 끝!
'Server, centOS 7 외' 카테고리의 다른 글
[ 서버 ] 자바, 블로그 구현, 톰캣원격배포 적용 (0) | 2020.10.04 |
---|---|
[ 서버 ] 비스프링 메이븐 의존성관리 도입 (0) | 2020.09.20 |
[ 서버 ] 작업24, 도메인에서 www 지우기, nginx url rewrite (0) | 2020.09.20 |
[ 서버 ] 작업23, CentOS7, 대용량 파일 업로드시, nginx 413 Request Entity Too Large 오류 해결법 (0) | 2020.09.20 |
[ 서버 ] 리눅스 - CentOS 7, 서블릿, 스프링 호스팅, 빠른버전 영상 자료(실행 방법, 순서) (0) | 2020.09.19 |