Что такое эквивалент ConsoleAppender.setWriter в log4j-2

#logging #log4j #log4j2

Вопрос:

Я пытаюсь перейти с log4j-1.2 на log4j-2

Что эквивалентно для следующих строк в log4j-2?

 import org.apache.log4j.ConsoleAppender;
import org.apache.log4j.Logger;
import org.apache.log4j.PatternLayout;

public static final Logger s_logger = Logger.getLogger(x.class);
ConsoleAppender ca = new ConsoleAppender();
ca.setWriter(new OutputStreamWriter(System.out, "UTF-8"));
ca.setLayout(new PatternLayout("%-5p [%t]: %m%n"));
s_logger.addAppender(ca);
 

Я не смог найти ответ в документации Apache.

Ответ №1:

В Log4j2 есть два основных изменения, касающиеся вашего кода:

  • Log4j2 разделен на API и реализацию, поэтому an org.apache.logging.log4j.Logger не обязательно является org.apache.logging.log4j.core.Logger ,
  • компоненты создаются с использованием шаблона builder и не имеют установщиков.

Ближайший эквивалент вашего кода использует WriterAppender :

 Logger logger = LogManager.getLogger();
if (logger instanceof org.apache.logging.log4j.core.Logger) {
    StringLayout layout = PatternLayout.newBuilder().withPattern("%-5p [%t]: %m%n").build();
    OutputStreamWriter writer = new OutputStreamWriter(System.out, StandardCharsets.UTF_8);
    Appender appender = WriterAppender.newBuilder().setTarget(writer).setLayout(layout).build();
    ((org.apache.logging.log4j.core.Logger) logger).addAppender(appender);
}
 

Ограничено ConsoleAppender использованием либо System.out или System.err и использует системную кодировку по умолчанию:

 Logger logger = LogManager.getLogger();
if (logger instanceof org.apache.logging.log4j.core.Logger) {
    StringLayout layout = PatternLayout.newBuilder().withPattern("%-5p [%t]: %m%n").build();
    Appender appender = ConsoleAppender.newBuilder().setTarget(Target.SYSTEM_OUT).setLayout(layout).build();
    ((org.apache.logging.log4j.core.Logger) logger).addAppender(appender);
}
 

Приведенные выше примеры кода используют этот импорт:

 import java.io.OutputStreamWriter;
import java.nio.charset.StandardCharsets;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.core.Appender;
import org.apache.logging.log4j.core.StringLayout;
import org.apache.logging.log4j.core.appender.ConsoleAppender;
import org.apache.logging.log4j.core.appender.ConsoleAppender.Target;
import org.apache.logging.log4j.core.appender.WriterAppender;
import org.apache.logging.log4j.core.layout.PatternLayout;