es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

No se puede establecer el nivel del logger programáticamente para el append de la raíz.

En mi proyecto de Java uso log4j. Si quiero configurar programáticamente el registrador para el iniciador raíz, uso esto:

import org.apache.log4j.Logger;
private static final Logger logger = Logger.getLogger(Main.class);

AppenderSkeleton consoleAppender = (AppenderSkeleton) Logger.getRootLogger().getAppender("Console");
AppenderSkeleton fileAppender = (AppenderSkeleton) Logger.getRootLogger().getAppender("File");

Genial. Funciona bien.

Pero ahora actualicé a log4j2 (slf4j).

Y ahora aquí está mi código:

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

private static final Logger logger = LoggerFactory.getLogger(App.class);

AppenderSkeleton consoleAppender = (AppenderSkeleton) Logger.getRootLogger().getAppender("Console");
AppenderSkeleton fileAppender = (AppenderSkeleton) Logger.getRootLogger().getAppender("File");

Pero ahora obtengo un error:

error: no se puede encontrar el símbolo Logger.getRootLogger()

¿Cómo puedo configurar programáticamente el nivel raíz para slf4j?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    No puedes usar Logger.getRootLogger() con slf4j ya que es un framework de registro diferente. En su lugar, puedes obtener el registrador raíz de log4j2 usando la clase LogManager y configurarlo programáticamente. Aquí tienes un ejemplo:

    import org.apache.logging.log4j.LogManager;
    import org.apache.logging.log4j.Logger;
    import org.apache.logging.log4j.core.config.Configuration;
    import org.apache.logging.log4j.core.config.ConfigurationFactory;
    import org.apache.logging.log4j.core.config.ConfigurationSource;
    import org.apache.logging.log4j.core.config.Order;
    import org.apache.logging.log4j.core.config.plugins.Plugin;
    
    @Plugin(name = "CustomConfigurationFactory", category = ConfigurationFactory.CATEGORY)
    @Order(50)
    public class CustomConfigurationFactory extends ConfigurationFactory {
        private static Configuration config;
    
        static {
            try {
                ConfigurationSource source = new ConfigurationSource(
                  CustomConfigurationFactory.class.getResourceAsStream("/log4j2.xml"));
                config = new LoggerContext("CustomLoggerContext").getConfiguration();
                config.initialize(source);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    
        @Override
        public Configuration getConfiguration(LoggerContext loggerContext, ConfigurationSource source) {
            return config;
        }
    
        @Override
        public Configuration getConfiguration(LoggerContext loggerContext, String name, URI configLocation) {
            return config;
        }
    }
    
    public class App {
        private static Logger logger = LogManager.getLogger(App.class);
    
        public static void main(String[] args) {
            // establecer programáticamente el nivel del registrador raíz en INFO
            Configuration config = LogManager.getContext(false).getConfiguration();
            config.getRootLogger().setLevel(Level.INFO);
            LoggerContext.getContext(false).updateLoggers(config);
    
            logger.debug("Mensaje de depuración");
            logger.info("Mensaje de información");
            logger.error("Mensaje de error");
        }
    }
    

    En el ejemplo anterior, hemos creado una fábrica de configuración personalizada para cargar el archivo de configuración de log4j2 (log4j2.xml). En el método main(), hemos establecido programáticamente el nivel del registrador raíz en INFO utilizando el método getRootLogger() de la clase org.apache.logging.log4j.core.Logger.

    Ten en cuenta que este enfoque requiere agregar la dependencia log4j-core a tu proyecto.

Comments are closed.