๋ณธ๋ฌธ์œผ๋กœ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๋ฐ˜์‘ํ˜•

 

logback-spring.xml

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

    <property name="LOG_PATH" value="logs" />

    <!-- ์ฝ˜์†” ์ถœ๋ ฅ ์„ค์ • (INFO ์ด์ƒ๋งŒ) -->
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>

    <!-- ์—๋Ÿฌ ์ „์šฉ ๋กœ๊ทธ ํŒŒ์ผ (์˜ˆ์™ธ ํ•ธ๋“ค๋Ÿฌ ์ „์šฉ) -->
    <appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOG_PATH}/error.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${LOG_PATH}/error-%d{yyyy-MM-dd}.log</fileNamePattern>
            <maxHistory>30</maxHistory>
        </rollingPolicy>
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>ERROR</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

    <!-- ๋ฃจํŠธ ๋กœ๊ฑฐ: ์ฝ˜์†”์—๋งŒ INFO ์ด์ƒ ํ‘œ์‹œ (์—๋Ÿฌ๋Š” ์ฝ˜์†”์— ์•ˆ ์ฐํž˜) -->
    <root level="INFO">
        <appender-ref ref="STDOUT" />
    </root>

    <!-- ์˜ˆ์™ธ ํ•ธ๋“ค๋Ÿฌ ํŒจํ‚ค์ง€๋งŒ ์—๋Ÿฌ ๋กœ๊ทธ ํŒŒ์ผ์— ๊ธฐ๋ก, ์ค‘๋ณต ๋ฐฉ์ง€ -->
    <logger name="com.example.demo.global.exception" level="ERROR" additivity="false">
        <appender-ref ref="ERROR_FILE" />
    </logger>

</configuration>

 

exception ํŒŒ์ผ์—์„œ log ์ถ”๊ฐ€

@ExceptionHandler(Exception.class)
    public ModelAndView handleGeneralException(Exception ex, HttpServletRequest request) {
        String uri = request.getRequestURI();
        String method = request.getMethod();
        String ip = request.getRemoteAddr();
        String params = request.getQueryString();
        log.error("์š”์ฒญ URI: {}\n์š”์ฒญ ๋ฐฉ์‹: {}\nIP: {}\nํŒŒ๋ผ๋ฏธํ„ฐ: {}", uri, method, ip, (params != null ? params : "์—†์Œ"));
        log.error("์˜ˆ๊ธฐ์น˜ ๋ชปํ•œ ์—๋Ÿฌ ๋ฐœ์ƒ: {}", ex.getMessage());

        ModelAndView mav = new ModelAndView("custom-error");
        mav.addObject("message", "์˜ˆ๊ธฐ์น˜ ๋ชปํ•œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค: " + ex.getMessage());
        mav.addObject("redirectUrl", "/");
        mav.addObject("delay", 5);
        return mav;
    }

 

ํ•˜๋ฉด ์ด๋Ÿฐ์‹์œผ๋กœ ๋กœ๊ทธํŒŒ์ผ์ด ์ƒ์„ฑ๋œ๋‹ค.

๋ฐ˜์‘ํ˜•