Java์˜ ์—ฌ๋Ÿฌ๊ฐ€์ง€ Logger๋“ค

Java ์ง„์˜์—๋Š” ์—ฌ๋Ÿฌ๊ฐ€์ง€ ๋กœ๊น… ๊ด€๋ จ ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ํ”ํžˆ ์ ‘ํ•˜๊ธฐ ์–ด๋ ค์šด commons logging๊ณผ JUL(Java Uitl Logging)๋„ ์žˆ๊ณ ์š”. ์ด๋ฒˆ์— ๋น„๊ตํ•  ๋Œ€์ƒ์ธ log4j, logback ๊ทธ๋ฆฌ๊ณ  log4j2๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฐ„๋‹จํ•˜๊ฒŒ ์‹œ๊ฐ„ ์ˆœ์„œ๋Œ€๋กœ ๋น„๊ตํ•˜๋ฉด log4j, logback, log4j2 ์ˆœ์„œ๋กœ ๋“ฑ์žฅํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‹ˆ๊นŒ log4j2๊ฐ€ ์ƒ๋Œ€์ ์œผ๋กœ ์ตœ๊ทผ์— ๋“ฑ์žฅํ•œ ๋กœ๊น… ํ”„๋ ˆ์ž„์›Œํฌ์ง€์š”. logback๊ณผ log4j2๋Š” log4j๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๊ณ  ์žˆ์–ด์„œ ์„ค์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‚˜ ์‚ฌ์šฉ ๋ฐฉ๋ฒ•์ด ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

๋น„์Šทํ•˜๊ธด ํ•˜์ง€๋งŒ ๋‹ค๋ฅธ ๋กœ๊น… ํ”„๋ ˆ์ž„์›Œํฌ๋กœ ์ „ํ™˜ํ•  ๋•Œ๋ฅผ ์ƒ๊ฐํ•œ๋‹ค๋ฉด slf4j ๋ผ๋Š” ๋…€์„์˜ ๋„์›€์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. slf4j๋Š” Java ์ง„์˜์˜ ๋กœ๊น… ํ”„๋ ˆ์ž„์›Œํฌ๋“ค์˜ ์ถ”์ƒ์ฒด(facade) ์—ญํ• ์„ ํ•˜๋Š”๋ฐ์š”. ์ž๋ฐ”๋กœ ๋”ฐ์ง€๋ฉด ์ธํ„ฐํŽ˜์ด์Šค์™€ ๋น„์Šทํ•œ ์—ญํ• ์„ ํ•˜๋ฉฐ ์‚ฌ์šฉ์ค‘์ธ ๋กœ๊น… ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ๋ณ€๊ฒฝ๋˜๋”๋ผ๋„ ์†Œ์Šค ์ฝ”๋“œ ์ž์ฒด์˜ ๋ณ€๊ฒฝ์„ ๋ง‰์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


Logger ์ถ”์ƒ์ฒด slf4j

slf4j๋Š” ๋ง๊ทธ๋Œ€๋กœ ๋กœ๊น…์— ๋Œ€ํ•œ ์ถ”์ƒ์ฒด๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ด๋ฉฐ ๊ทธ ์ž์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํŽธ์€ ์ ์Šต๋‹ˆ๋‹ค. ๊ฐ„๋‹จํ•˜๊ฒŒ ์˜ˆ์ œ๋ฅผ ์‚ดํŽด๋ณด๋ฉด ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋จผ์ € ์•„๋ž˜์™€ ๊ฐ™์ด dependency๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผ ๊ฒ ์ง€์š”?

<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
    <version>1.7.25</version>
</dependency>

์‹คํ–‰์„ ์œ„ํ•œ ์ž๋ฐ” ์ฝ”๋“œ๋„ ์ž‘์„ฑํ•˜๊ณ ์š”.

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * @author Kimtaeng
 * Created on 2018. 9. 21.
 */
public class LoggingSample {
    Logger logger = LoggerFactory.getLogger(LoggingSample.class);

    public void someMethod() {
        logger.info("Hello slf4j Logger!");
    }

    public static void main(String[] args) {
        new LoggingSample().someMethod();
    }
}

์‹คํ–‰ํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™์€ ์˜ค๋ฅ˜๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation...์ƒ๋žต

๊ตฌํ˜„์ฒด๊ฐ€ ์—†๋‹ค๋Š” ๋œป์ด์ง€์š”. ์•ž์„œ ์–ธ๊ธ‰ํ–ˆ์ง€๋งŒ slf4j ์ž์ฒด๋ฅผ ๋กœ๊ฑฐ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๋ฅผ ๋ณธ ์ ์ด ๊ฑฐ์˜ ์—†๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค๋งŒ ๊ทธ๋ž˜๋„ ๊ถ๊ธˆํ•จ์„ ํ•ด๊ฒฐํ•ด๋ณด๊ณ ์žโ€ฆ slf4j-simple ์ด๋ผ๋Š” dependency๋ฅผ ์ถ”๊ฐ€ํ•ด์„œ ์‚ฌ์šฉํ•ด๋ด…์‹œ๋‹ค.

<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-simple</artifactId>
    <version>1.7.25</version>
</dependency>
[main] INFO post.logging.LoggingSample - Hello slf4j Logger!

์œ„์™€ ๊ฐ™์ด ๋กœ๊ทธ๊ฐ€ ์ฐํžˆ๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ธฐ๋Šฅ์ด ๋„ˆ๋ฌด ๋‹จ์ˆœํ•˜์—ฌ ์‹ค์ œ๋กœ๋Š” ์‚ฌ์šฉํ•  ํ•„์š”๊ฐ€ ์—†๊ธดํ•ฉ๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„ logback์ด๋‚˜ log4j2์™€ ๊ฐ™์€ ํ”„๋ ˆ์ž„์›Œํฌ์™€ ๊ฐ™์ด ์‚ฌ์šฉํ•˜์ง€์š”. slf4j๊ฐ€ ์ธํ„ฐํŽ˜์ด์Šค์˜ ์—ญํ• ์„ ํ•ด์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ๋กœ๊น… ๊ตฌํ˜„์ฒด๊ฐ€ ๋ฐ”๋€Œ๋”๋ผ๋„ ์ƒ๊ฐ๋ณด๋‹ค ์–ด๋ ต์ง€์•Š๊ฒŒ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


์ด์ œ ์•ˆ๋…• log4j

Apache์˜ log4j๋Š” ๊ฝค ์˜ค๋ž˜๋œ ๋กœ๊น… ํ”„๋ ˆ์ž„์›Œํฌ์ž…๋‹ˆ๋‹ค. 2015๋…„์— ๊ฐœ๋ฐœํŒ€์˜ log4j ๊ฐœ๋ฐœ ์ค‘๋‹จ ๋ฐœํ‘œ๊ฐ€ ์žˆ์—ˆ๊ณ ์š”. ์ด์ œ๋Š” ์ƒˆ ํ”„๋กœ์ ํŠธ์— ์ ์šฉํ•˜๋ ค๋ฉด ๋‹ค๋ฅธ ๋กœ๊น… ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

log4j๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด dependency ์ถ”๊ฐ€๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

<dependency>
    <groupId>log4j</groupId>
    <artifactId>log4j</artifactId>
    <version>1.2.17</version>
</dependency>

์„ค์ •์— ํ•„์š”ํ•œ log4j.properties ํŒŒ์ผ๋„ ํ•„์š”ํ•˜๊ณ ์š”.

log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{HH:mm:ss,SSS} %-5p [%c] - %m%n

log4j.rootLogger=info, stdout

์•„๋ž˜์™€ ๊ฐ™์ด ์‹คํ–‰ํ•˜์—ฌ ๋กœ๊ทธ๋ฅผ ์ถœ๋ ฅํ•  ์ž๋ฐ” ์ฝ”๋“œ๋„ ์ž‘์„ฑํ•ด์ค๋‹ˆ๋‹ค.

import org.apache.log4j.Logger;

/**
 * @author Kimtaeng
 * Created on 2018. 9. 21.
 */
public class LoggingSample {
    Logger logger = Logger.getLogger(LoggingSample.class);

    public void someMethod() {
        logger.info("Hello log4j Logger!");
    }

    public static void main(String[] args) {
        new LoggingSample().someMethod();
    }
}
INFO [post.logging.LoggingSample] - Hello log4j Logger!

์‚ฌ์šฉ์€ ๊ฐ„๋‹จํ•˜์ง€์š”? ์ฝ˜์†”๋กœ ์ถœ๋ ฅํ•˜๋Š” stdout ์™ธ์—๋„ ํŒŒ์ผ ์ถœ๋ ฅ๋„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์—ญ์‹œ๋‚˜ 2015๋…„์— ๊ฐœ๋ฐœ์ด ์ค‘๋‹จ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ธฐ์กด ์‹œ์Šคํ…œ์ด ์•„๋‹ˆ๋ผ๋ฉด ์‚ฌ์šฉํ•  ์ด์œ ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์‚ฌ์‹ค ์˜ค๋žซ๋™์•ˆ ๊ฐœ๋ฐœ๋˜์–ด์˜จ ์‹œ์Šคํ…œ์ด์–ด๋„ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๋Š” ๊ธฐํšŒ๊ฐ€ ์žˆ๋‹ค๋ฉด ๋ฐ”๊พธ๋Š” ๊ฒƒ์ด ์ข‹๊ฒ ์ง€์š”.


log4j๋ฅผ ์ž‡๋Š”๋‹ค. logback

log4j๋ฅผ ๊ตฌํ˜„ํ•œ ๊ฐœ๋ฐœ์ž๊ฐ€ logback์„ ๊ฐœ๋ฐœํ–ˆ์Šต๋‹ˆ๋‹ค. log4j์™€ ์œ ์‚ฌํ•˜๋ฉด์„œ๋„ ํ–ฅ์ƒ๋œ ์„ฑ๋Šฅ๊ณผ ํ•„ํ„ฐ๋ง ์˜ต์…˜์„ ์ œ๊ณตํ•˜๋ฉฐ slf4j๋„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ฐธ ํŽธ๋ฆฌํ•œ ์ž๋™ ๋ฆฌ๋กœ๋“œ๋„ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

Maven์œผ๋กœ ๊ด€๋ฆฌํ•˜๋Š” ํ”„๋กœ์ ํŠธ์—์„œ logback ๊ด€๋ จ dependency๋ฅผ ์ถ”๊ฐ€ํ•˜๋ ค๊ณ  ํ•˜๋ฉด logback-core์™€ logback-classic์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ์š”. core์˜ ๊ฒฝ์šฐ ๋กœ๊น… ํ”„๋ ˆ์ž„์›Œํฌ๋กœ์„œ์˜ ํ•ต์‹ฌ ๊ธฐ๋Šฅ์ด ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. classic์˜ ๊ฒฝ์šฐ๋Š” ํ•ต์‹ฌ ๊ธฐ๋Šฅ์— slf4j์— ๋Œ€ํ•œ ์ง€์›๊ณผ ๊ฐ™์€ ์ถ”๊ฐ€ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

์‚ฌ์šฉํ•˜๋ ค๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด dependency ์ถ”๊ฐ€ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
    <version>1.2.3</version>
</dependency>

์„ค์ •์€ xml๋กœ ์ง„ํ–‰ํ•ด๋ด…์‹œ๋‹ค. logback.xml์„ ์ƒ์„ฑํ•˜๊ณ  ์•„๋ž˜์™€ ๊ฐ™์ด ๊ฐ„๋‹จํ•˜๊ฒŒ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.

<configuration>
    <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>
    <root level="debug">
        <appender-ref ref="STDOUT" />
    </root>
</configuration>

๊ทธ๋ฆฌ๊ณ  ์‹คํ–‰ํ•  ์ž๋ฐ” ์ฝ”๋“œ๋„ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * @author Kimtaeng
 * Created on 2018. 9. 21.
 */
public class LoggingSample {
    Logger logger = LoggerFactory.getLogger(LoggingSample.class);

    public void someMethod() {
        logger.info("Hello logback Logger!");
    }

    public static void main(String[] args) {
        new LoggingSample().someMethod();
    }
}
[main] INFO post.logging.LoggingSample - Hello logback Logger!

์ถœ๋ ฅํ•  ๋กœ๊ทธ ํฌ๋งท์ด๋‚˜ ํŠน์ • ํŒจํ‚ค์ง€์— ์ ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ• ๋“ฑ ์ฐพ์•„๋ณด๋ฉด ๋‹ค์–‘ํ•œ logback ์„ค์ • ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค.


๊ฐ€์žฅ ์ตœ์‹ ์ด๋‹ค. log4j2

log4j2๋Š” ์•ž์„œ ์‚ดํŽด๋ณธ log4j์™€ logback๊ณผ ๋น„๊ตํ–ˆ์„ ๋•Œ ๊ฐ€์žฅ ์ตœ๊ทผ์— ๋“ฑ์žฅํ–ˆ์Šต๋‹ˆ๋‹ค. logback๊ณผ ๋™์ผํ•˜๊ฒŒ ์ž๋™ ๋ฆฌ๋กœ๋“œ ๊ธฐ๋Šฅ๊ณผ ํ•„ํ„ฐ๋ง ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

์„ค์ •์€ ์•„๋ž˜์™€ ๊ฐ™์ด ์ง„ํ–‰ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ๋จผ์ € dependency๋ฅผ ์„ ์–ธํ•ด์•ผ ํ•˜๊ณ ์š”.

<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
    <version>1.7.25</version>
</dependency>
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-api</artifactId>
    <version>2.9.0</version>
</dependency>
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-core</artifactId>
    <version>2.9.0</version>
</dependency>
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-slf4j-impl</artifactId>
    <version>2.9.0</version>
</dependency>

log4j2์— ๋Œ€ํ•œ ์„ค์ •์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ง„ํ–‰ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. log4j2.xml์„ ์ƒ์„ฑํ•˜๊ณ  ์•„๋ž˜์™€ ๊ฐ™์ด ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="warn" >
    <Appenders>
        <Console name="STDOUT" target="SYSTEM_OUT">
            <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
        </Console>
    </Appenders>
    <Loggers>
        <Root level="info">
            <AppenderRef ref="STDOUT"/>
        </Root>
    </Loggers>
</Configuration>

์ž๋ฐ” ์ฝ”๋“œ๋Š” ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋ณ€๊ฒฝ์„ ๊ตฌ๋ถ„ํ•˜๊ธฐ ์œ„ํ•ด์„œ ๋กœ๊ทธ๋กœ ์ถœ๋ ฅ๋  ๋ฉ”์‹œ์ง€๋งŒ ๋ฐ”๊ฟจ์„๋ฟ Logger์— ๋Œ€ํ•œ ์„ค์ •์€ logback์—์„œ์˜ ์„ค์ •๊ณผ ๋ณ€๊ฒฝ๋œ ๊ฒƒ์ด ์—†์Šต๋‹ˆ๋‹ค. ํŒจํ‚ค์ง€ import๋„ ๋™์ผํ•˜๊ณ ์š”.

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * @author Kimtaeng
 * Created on 2018. 9. 21.
 */
public class LoggingSample {
    Logger logger = LoggerFactory.getLogger(LoggingSample.class);

    public void someMethod() {
        logger.info("Hello log4j2 Logger!");
    }

    public static void main(String[] args) {
        new LoggingSample().someMethod();
    }
}
[main] INFO post.logging.LoggingSample - Hello log4j2 Logger!

์•ž์„œ ์–ธ๊ธ‰ํ•œ ๊ฒƒ์ฒ˜๋Ÿผ slf4j๊ฐ€ ์žˆ๊ธฐ๋•Œ๋ฌธ์— logback๊ณผ log4j2๋ฅผ ๋น„๊ต์  ๊ฐ„๋‹จํ•˜๊ฒŒ ์ „ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. dependency ์„ ์–ธ๋งŒ ๋ณ€๊ฒฝํ–ˆ์„๋ฟ ์‹ค์ œ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•œ ๋ถ€๋ถ„์€ ์—†์Šต๋‹ˆ๋‹ค.


๊ทธ๋Ÿผ ๋ญ๊ฐ€ ์ข‹์„๊นŒ?

log4j๋Š” ๊ฐœ๋ฐœ์ด ์ค‘๋‹จ๋˜์—ˆ์œผ๋ฏ€๋กœ ๋น„๊ต ๋Œ€์ƒ์—์„œ ์ œ์™ธํ•œ๋‹ค๋ฉด logback๊ณผ log4j2๊ฐ€ ๋‚จ์•˜๋Š”๋ฐ์š”. ๊ณผ์—ฐ ์–ด๋А ๋กœ๊น… ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ๋” ์ข‹์„๊นŒ? ๋ผ๋Š” ์งˆ๋ฌธ์˜ ๊ธ€์„ ๋งŽ์ด ๋ณธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋‹จ์ˆœํ•˜๊ฒŒ ๋น„๊ต๋งŒ ํ•ด๋ณธ๋‹ค๋ฉด ๊ฐ€์žฅ ์ตœ์‹ (์ตœ์‹ ์ด๋ผ๊ณ  ํ•ญ์ƒ ์ข‹์€ ๊ฒƒ์€ ์•„๋‹ˆ์ง€๋งŒ)์ด์ž ๋น ๋ฅด๋ฉฐ logback์˜ ์•„ํ‚คํ…์ฒ˜์—์„œ ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ์ ์„ ์ˆ˜์ •ํ•œ ์ด๋ผ๊ณ  Apache๊ฐ€ ์†Œ๊ฐœํ•˜๋Š” log4j2๋ฅผ ๊ถŒ์žฅํ•  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

Apache์— ๋”ฐ๋ฅด๋ฉด ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ์˜ ๋น„๋™๊ธฐ ๋กœ๊ฑฐ(Async Logger)์˜ ๊ฒฝ์šฐ log4j 1.x ๋ฐ logback๋ณด๋‹ค ๋ช‡ ๋ฐฐ๋‚˜ ๋˜๋Š” ์ฒ˜๋ฆฌ๋Ÿ‰์„ ๋ณด์ธ๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋žŒ๋‹ค ํ‘œํ˜„์‹๊ณผ ์‚ฌ์šฉ์ž ์ •์˜ ๋กœ๊ทธ ๋ ˆ๋ฒจ๋„ ์ง€์›ํ•˜๊ณ ์š”.

2018๋…„ 9์›”์„ ๊ธฐ์ค€์œผ๋กœ log4j2์˜ ์ตœ์‹  ๋ฒ„์ „์€ 7์›”์— Release๋œ 2.11.1 ์ž…๋‹ˆ๋‹ค.