[ 서버 ] centOS7, 스프링부트, 로그를 파일로 저장하는 설정 켜기

JooKit 주킷 2020. 9. 20. 13:59
목차 접기
728x90
반응형

※ [ 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. 끝!

 

 

 

 

 

 

 

 

 

 

 

 

 

   

 

728x90
반응형
LIST