Back-End/Spring

Spring, Springboot Logback 설정 Logback in XML or Java(Logback XML 설정, Java Class 설정, SQL Log, SQL console Log)

개발자 DalBy 2024. 5. 14. 16:25
반응형

Spring, Springboot LogBack 설정 LogBack in xml, Java

 

이번에는 spring에서 logBack을 설정하는 방법을 포스팅 하게 되었습니다.

먼저 설정에 앞서 xml또는 Java의 두 가지의 버전이 있습니다.

 

XML로 설정하는 방법 또는 Java로 설정하는 방법을 예시와 함께 설명 드리겠습니다. 

먼저 XML로 설정하는 방법을 보면 아래 코드와 같습니다.

<?xml version="1.0" encoding="UTF-8"?>
<configuration>

    <!-- 콘솔 로그 -->
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>

    <!-- 파일 생성 -->
    <appender name="FILE" class="ch.qos.logback.core.FileAppender">
        <file>logs/log.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>logs/log.%d{yyyy-mm-dd}.log</fileNamePattern>
            <maxHistory>30</maxHistory> <!-- Keep 30 days worth of logs -->
        </rollingPolicy>
        <!--<append>true</append>-->
        <encoder>
            <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>

    <!-- 패키징 log -->
    <logger name="com.*" level="DEBUG" additivity="false">
        <appender-ref ref="CONSOLE"/>
        <appender-ref ref="FILE"/>
    </logger>

    <!-- SQL Log -->
    <logger name="jdbc.sqlonly" level="DEBUG">
        <appender-ref ref="CONSOLE" />
    </logger>

    <logger name="jdbc.sqltiming" level="INFO">
        <appender-ref ref="CONSOLE" />
    </logger>

    <logger name="jdbc.resultset" level="OFF">
        <appender-ref ref="CONSOLE" />
    </logger>

    <logger name="jdbc.audit" level="OFF">
        <appender-ref ref="CONSOLE" />
    </logger>

    <logger name="jdbc.resultsettable" level="INFO">
        <appender-ref ref="CONSOLE" />
    </logger>

    <logger name="jdbc.connection" level="OFF">
        <appender-ref ref="CONSOLE" />
    </logger>

    <!-- logger level -->
    <root level="INFO">
        <appender-ref ref="CONSOLE"/>
        <appender-ref ref="FILE"/>
    </root>

</configuration>

 

console 로그 설정과 DB 로그 설정 또는 Log파일 생성 등 설정 정보가 있습니다. 

xml 파일을 연결시켜 줍니다. yml 또는 properties (예시의 경우 properties )

# logBack
logging.config=classpath:templates/logback.xml

 

추가로 SQL Log를 남기고 싶다면, 

의존성을 추가 합니다.

/* SQL log */
implementation 'org.bgee.log4jdbc-log4j2:log4jdbc-log4j2-jdbc4.1:1.16'

 

이후 log4jdbc.log4j2.properties 파일을 생성하여

log4jdbc.spylogdelegator.name=net.sf.log4jdbc.log.slf4j.Slf4jSpyLogDelegator
log4jdbc.dump.sql.maxlinelength=0

위와 같이 셋팅 해 줍니다.

 

디비 커넥션 정보가 있는 곳에서 DB 정보를 수정 해 줍니다.

spring.datasource.driver-class-name=net.sf.log4jdbc.sql.jdbcapi.DriverSpy
spring.datasource.url=jdbc:log4jdbc:sqlserver://localhost:1433;databaseName=DB;encrypt=true;trustServerCertificate=true
spring.datasource.username=username
spring.datasource.password=password

 

결과:

IDE console

IDE console DB 로그 확인
IDE console DB 로그 확인

 

log 파일

IDE console DB 로그 확인
실제 log 파일

 

로그가 console또는 Log 파일에서 잘 확인 되는 것을 알 수 있습니다.

 

 

 

Java로 구현한 버전은 다음과 같습니다.

먼저 @Configuration할 class 하나와 메소드 @Bean을 생성 합니다.(@Bean 어노테이션이 들어간 method는 void를 사용할 수 없습니다. (반환 타입 필수 입니다.) 아래 코드는 예시 임을 참고 해 주시면 감사드리겠습니다.)

@Configuration
public class LogBackConfig {

    @Bean
    public void configureLogback() {
    
    }

}

 

@Bean 메소드 안에 Log에 적용할 패키지 경로 및 추가적으로 필요한 설정을 추가 해 줍니다.

@Bean
public void configureLogback() {
    
    Logger rootLogger = (Logger) LoggerFactory.getLogger("com.*");
    
    // Set log level
    rootLogger.setAdditive(false);
    rootLogger.setLevel(Level.DEBUG);
    
    // DB Logger SET
    Logger sqlonly = (Logger) LoggerFactory.getLogger("jdbc.sqlonly");
    sqlonly.setLevel(Level.DEBUG);

    Logger sqltiming = (Logger) LoggerFactory.getLogger("jdbc.sqltiming");
    sqltiming.setLevel(Level.INFO);

    Logger resultset = (Logger) LoggerFactory.getLogger("jdbc.resultset");
    resultset.setLevel(Level.OFF);

    Logger audit = (Logger) LoggerFactory.getLogger("jdbc.audit");
    audit.setLevel(Level.OFF);

    Logger resultsettable = (Logger) LoggerFactory.getLogger("jdbc.resultsettable");
    resultsettable.setLevel(Level.INFO);

    Logger connection = (Logger) LoggerFactory.getLogger("jdbc.connection");
    connection.setLevel(Level.OFF);
    
}

 

@Bean configureLogback()에서

loggerContext를 선언하여 LoggerFactory를 담아 줍니다.

LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory();

 

그 다음 console, File, FileRollingPolicy, patternEncoder를 추가 한 후, root log에 append 해 줍니다.

        // 콘솔
        ConsoleAppender consoleAppender = new ConsoleAppender();
        consoleAppender.setContext(loggerContext);
        consoleAppender.setName("CONSOLE");

        // 파일
        FileAppender fileAppender = new FileAppender();
        fileAppender.setContext(loggerContext);
        fileAppender.setName("FILE");
        fileAppender.setFile("logs/log-"+date+".log");

        TimeBasedRollingPolicy rollingPolicy = new TimeBasedRollingPolicy();
        rollingPolicy.setContext(loggerContext);
        rollingPolicy.setParent(fileAppender); // rollingFileAppender
        rollingPolicy.setFileNamePattern("logs/log.%d{yyyy-MM-dd}.%i.log");
        rollingPolicy.setMaxHistory(30);
        rollingPolicy.setTotalSizeCap(FileSize.valueOf("100MB"));

        // log 패턴 인코딩
        PatternLayoutEncoder encoder = new PatternLayoutEncoder();
        encoder.setContext(loggerContext);
        // %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
        encoder.setPattern("%date %-5level [%thread] %logger{35} - %msg%n");
        encoder.start();
        
        
        // 콘솔
        consoleAppender.setEncoder(encoder);
        consoleAppender.start();

        // 파일
        fileAppender.setEncoder(encoder);
        fileAppender.start();

        // root log append
        rootLogger.addAppender(fileAppender);
        rootLogger.addAppender(consoleAppender);

 

DB Log 설정, 필요시 append 합니다.

        // DB Logger SET
        sqlonly.addAppender(consoleAppender);
        sqltiming.addAppender(consoleAppender);
        resultset.addAppender(consoleAppender);
        audit.addAppender(consoleAppender);
        resultsettable.addAppender(consoleAppender);
        connection.addAppender(consoleAppender);

        sqlonly.addAppender(fileAppender);
        sqltiming.addAppender(fileAppender);
        resultset.addAppender(fileAppender);
        audit.addAppender(fileAppender);
        resultsettable.addAppender(fileAppender);
        connection.addAppender(fileAppender);

 

결과 예시는 xml 결과의 사진과 같습니다.

 

코드 간소화 정리 버전 sql (x) console과 log file 설정

@Configuration
@Primary
public class LogBackConfig  {

    @Value("${spring.log.path}")
    private String logPath;

    @Bean
    public LoggerContext loggerContext() {
        return (LoggerContext) LoggerFactory.getILoggerFactory();
    }

    @Bean
    public PatternLayoutEncoder patternLayoutEncoder(LoggerContext loggerContext) {
        PatternLayoutEncoder encoder = new PatternLayoutEncoder();
        encoder.setContext(loggerContext);
        encoder.setPattern("%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n");
        encoder.start();
        return encoder;
    }

    @Bean
    public ConsoleAppender consoleAppender(LoggerContext loggerContext, PatternLayoutEncoder encoder) {
        ConsoleAppender consoleAppender = new ConsoleAppender();
        consoleAppender.setContext(loggerContext);
        consoleAppender.setName("CONSOLE");
        consoleAppender.setEncoder(encoder);
        consoleAppender.start();
        ch.qos.logback.classic.Logger rootLogger = loggerContext.getLogger(org.slf4j.Logger.ROOT_LOGGER_NAME);
        rootLogger.addAppender(consoleAppender);
        return consoleAppender;
    }

    @Bean
    public FileAppender fileAppender(LoggerContext loggerContext, PatternLayoutEncoder encoder) {
        FileAppender fileAppender = new FileAppender();
        fileAppender.setContext(loggerContext);
        fileAppender.setName("FILE");
        fileAppender.setFile(logPath+"log-"+ StringUtils.getYYYYMMDD()+".log"); // Set the path for the log file
        fileAppender.setEncoder(encoder);
        fileAppender.start();
        ch.qos.logback.classic.Logger rootLogger = loggerContext.getLogger(org.slf4j.Logger.ROOT_LOGGER_NAME);
        rootLogger.addAppender(fileAppender);
        return fileAppender;
    }

}

 

 

 

 

 



반응형