(spring) slf4j + log4j2 적용

violet·2024년 5월 2일

Log4j2

  • 2024 현재 보안 업데이트 주기가 가장 빠르고 성능 또한 가장 좋은 로그 구현체 라이브러리
  • log4j --(10배성능)--> logback --(18배성능)--> log4j2

SLF4J

  • 여러가지 종류의 로그 라이브러리와 프로젝트 사이 중간단에 존재하는 라이브러리
    구현체(log4j/log4j2/jul/logback) -----> 추상화(SLF4J) -----> (프로젝트)
  • 사용하는 구현체 로그 라이브러리를 간단하게 변경 가능
  • 사용하는 구현체 로그 라이브러리를 변경하더라도 프로젝트는 SLF4J와 직접적으로 붙기때문에 코드 수정이 없음.
  1. spring mvc 프로젝트에 적용

1.1.1 gradle 프로젝트일때 build.gradle 파일의 dependencies 안에 해당 코드 추가

dependencies {
	implementation 'org.slf4j:slf4j-api:1.7.32'
    implementation 'org.apache.logging.log4j:log4j-slf4j-impl:2.17.1'
    implementation 'org.apache.logging.log4j:log4j-api:2.17.1'
    implementation 'org.apache.logging.log4j:log4j-core:2.17.1'
    }

1.1.2 maven 프로젝트일때 (생략)

1.2 [프로젝트]/src/main/resources 경로에 log4j2.xml 파일 추가

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
    <Properties>
        <Property name="logPath">/home/ubuntu/logme/tomcat8.5/logs</Property>
        <Property name="logMaxHistory">30</Property>
    </Properties>

    <Appenders>
        <RollingFile name="RollingFile" fileName="${logPath}/프로젝트명.log"
                     filePattern="${logPath}/프로젝트명.%d{yyyy-MM-dd}.log">
            <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} [%t] %-5level %logger{36} - %msg%n"/>
            <Policies>
                <TimeBasedTriggeringPolicy interval="1" modulate="true"/>
            </Policies>
            <DefaultRolloverStrategy max="${logMaxHistory}"/>
        </RollingFile>
    </Appenders>

    <Loggers>
        <Root level="info">
            <AppenderRef ref="RollingFile"/>
        </Root>
    </Loggers>
</Configuration>

1.3 java 파일에 테스트할 로그 작성

객체생성

Logger logger = LoggerFactory.getLogger("");	// 로그 메시지 객체 생성

메소드 작성

	@GetMapping("/test/{str}")
	public ResponseEntity<ResVO> test(@PathVariable String str) throws Exception
	{
		System.out.println("test : " + str);

		long sTime = System.currentTimeMillis();
		ResVO result = new ResVO();
		result.setResultcode(LogmeCode.proc_ok_num);
		long eTime = System.currentTimeMillis();

		System.out.println("소모시간(ms) : " + (eTime - sTime));
		String logStr = "Test logback level : ";
		logger.trace(logStr+"trace");
		logger.debug(logStr+"debug");
		logger.info(logStr+"info");
		logger.warn(logStr+"warn");
		logger.error(logStr+"error");

		if(result.getResultcode() != LogmeCode.proc_ok_num)
			return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(result);
		else
			return ResponseEntity.status(HttpStatus.OK).body(result);
	}

1.4 배포 후 server 단 tomcat/logs안에 존재하는 로그 파일 생성 및 내용 확인

tomcat8.5/logs/ 경로에 프로젝트명.log 파일 확인


파일 내부 로그 내용 확인 (날짜/메세지)

Q. 날짜별로 파일이 생기도록 설정했는데 왜 파일명이 날짜별로 생기지 않았는가?

A.

배포한 날짜가 2024/05/02 오전 10시이고 프로젝트명이 'RESTapi'라고 가정하면
2024/05/02 10:00 ~ 2024/05/02 23:59 까지 기록된 로그는 RESTapi.log에 기록되었다가
2024/05/03일날
RESTapi.2024-05-02.log 파일이 생성되며 로그 내용이 이관된다.
이관 이후 RESTapi.log 의 내용은 초기화 된다.

=> 쉽게말해 RESTapi.log에 기록된 로그데이터는 오늘 발생한 로그이며
이전날짜의 로그데이터를 조회하고싶을때는 RESTapi.이전날짜.log 파일을 참고하면 된다.

profile
기억저장소

0개의 댓글