All Downloads are FREE. Search and download functionalities are using the official Maven repository.

cn.taketoday.logging.Log4j2Logger Maven / Gradle / Ivy

/*
 * Original Author -> Harry Yang ([email protected]) https://taketoday.cn
 * Copyright © TODAY & 2017 - 2022 All Rights Reserved.
 *
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see [http://www.gnu.org/licenses/]
 */

package cn.taketoday.logging;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.message.Message;
import org.apache.logging.log4j.spi.ExtendedLogger;
import org.apache.logging.log4j.spi.LoggerContext;

import java.io.Serial;

/**
 * @author TODAY 
* 2019-11-03 16:09 */ final class Log4j2Logger extends Logger { static final LoggerContext loggerContext = LogManager.getContext(Log4j2Logger.class.getClassLoader(), false); private final ExtendedLogger logger; Log4j2Logger(ExtendedLogger logger) { super(logger.isDebugEnabled()); this.logger = logger; } @Override public String getName() { return logger.getName(); } @Override public boolean isTraceEnabled() { return debugEnabled && logger.isTraceEnabled(); } @Override public boolean isInfoEnabled() { return logger.isInfoEnabled(); } @Override public boolean isWarnEnabled() { return logger.isWarnEnabled(); } @Override public boolean isErrorEnabled() { return logger.isErrorEnabled(); } private org.apache.logging.log4j.Level getLevel(Level level) { return switch (level) { case INFO -> org.apache.logging.log4j.Level.INFO; case WARN -> org.apache.logging.log4j.Level.WARN; case DEBUG -> org.apache.logging.log4j.Level.DEBUG; case TRACE -> org.apache.logging.log4j.Level.TRACE; case ERROR -> org.apache.logging.log4j.Level.ERROR; }; } @Override protected void logInternal(Level level, Object message, Throwable t) { if (message instanceof String) { // Explicitly pass a String argument, avoiding Log4j's argument expansion // for message objects in case of "{}" sequences (SPR-16226) if (t != null) { this.logger.logIfEnabled(FQCN, getLevel(level), null, (String) message, t); } else { this.logger.logIfEnabled(FQCN, getLevel(level), null, (String) message); } } else { this.logger.logIfEnabled(FQCN, getLevel(level), null, message, t); } } @Override protected void logInternal(Level level, String format, Throwable t, Object[] args) { final Message message = new Message() { @Serial private static final long serialVersionUID = 1L; private String msg; @Override public Throwable getThrowable() { return t; } @Override public Object[] getParameters() { return args; } @Override public String getFormattedMessage() { if (msg == null) { msg = MessageFormatter.format(format, args); } return msg; } @Override public String getFormat() { return msg; } }; this.logger.logIfEnabled(FQCN, getLevel(level), null, message, t); } } final class Log4j2LoggerFactory extends LoggerFactory { Log4j2LoggerFactory() { LogManager.class.getName(); } @Override protected Logger createLogger(String name) { LoggerContext context = Log4j2Logger.loggerContext; if (context == null) { // Circular call in early-init scenario -> static field not initialized yet context = LogManager.getContext(Log4j2Logger.class.getClassLoader(), false); } ExtendedLogger logger = context.getLogger(name); return new Log4j2Logger(logger); } }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy