当前位置: 首页 > 知识库问答 >
问题:

如何为取自变量而不是文件的log4j2应用xml配置?

钮瀚
2023-03-14

如何为取自变量而不是文件的log4j2应用xml配置

byte[] loggerConfig = getLoggerConfig();
ByteArrayInputStream is = new ByteArrayInputStream(loggerConfig);
ConfigurationSource src = new ConfigurationSource(is);
LoggerContext ctx = (LoggerContext) LogManager.getContext(false);
XmlConfiguration cfg = new XmlConfiguration(ctx, src);
//below are some commands which I've tried to use without success
Configuration c = cfg.reconfigure();
cfg.initialize();
cfg.start();
ctx.updateLoggers();
ctx.setConfigLocation(instance.getClass().getResource(getLoggerConfigFileName()).toURI());
<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
    <Appenders>
        <RollingRandomAccessFile name="logs" fileName="logs.log"  filePattern="logs.log.%i" immediateFlush="false">
            <PatternLayout pattern="%d %-5p [%c] %m%n" />
            <Policies>
                <SizeBasedTriggeringPolicy size="8 MB" />
            </Policies>
            <DefaultRolloverStrategy max="3" />
        </RollingRandomAccessFile>
    </Appenders>
    <Loggers>
        <AsyncLogger name="x" level="ERROR" additivity="false" includeLocation="true">
            <AppenderRef ref="logs" />
        </AsyncLogger>
    </Loggers>
</Configuration>
package x;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.core.LoggerContext;
import org.apache.logging.log4j.core.config.Configuration;
import org.apache.logging.log4j.core.config.ConfigurationSource;
import org.apache.logging.log4j.core.config.xml.XmlConfiguration;

import java.io.IOException;
import java.net.URISyntaxException;

public class log4j2v1 {
    private static final log4j2v1 instance = new log4j2v1();
    private static final Logger log = LogManager.getLogger(log4j2v1.class);

    public static void main(String[] args) {
        //init1();  //comment this - uncomment init2
        init2();    //comment this - uncomment init1
        log.error("err1");
        log.info("inf1");
    }

    private static void init1() {
        try {
            LoggerContext ctx = (LoggerContext) LogManager.getContext(false);
            ctx.setConfigLocation(instance.getClass().getResource("../log4j.xml").toURI());
            System.out.println("init1 finished w/o exception");
        } catch (URISyntaxException e) {
        }
    }

    private static void init2() {
        try {
            ConfigurationSource src = new ConfigurationSource(instance.getClass().getResource("../log4j.xml").openStream());
            LoggerContext ctx = (LoggerContext) LogManager.getContext(false);
            XmlConfiguration cfg = new XmlConfiguration(ctx, src);
            //below are some commands which I've tried to use without success
            Configuration c = cfg.reconfigure();
            cfg.initialize();
            cfg.start();
            ctx.updateLoggers();
            System.out.println("init2 finished w/o exception");
        } catch (IOException e) {
        }
    }
}

共有1个答案

寇坚成
2023-03-14

似乎使魔法的命令是

Configurator.reconfigure(cfg);

所以固定的init2方法应该是

    private static void init2() {
        try {
            ConfigurationSource src = new ConfigurationSource(instance.getClass().getResource("l4j2.xml").openStream());
            LoggerContext ctx = (LoggerContext) LogManager.getContext(false);
            XmlConfiguration cfg = new XmlConfiguration(ctx, src);
            Configurator.reconfigure(cfg);
            System.out.println("init2 finished w/o exception");
        } catch (IOException e) {
        }
    }
 类似资料:
  • 我想使用新的log4j2-Java日志框架。一切正常,但我从一小时后就尝试加载一个自定义配置文件来配置日志记录(如日志级别)。 这是我的log4j2.xml: 我尝试了以下方法,但没有任何效果: 移动log4j2.xml文件,使其位于默认包中。 将log4j2.xml文件移动到项目中的任意位置 将log4j2.xml文件命名为log4j.xml 在项目中创建一个文件夹,将log4j2.xml文件放

  • 在我使用Log4j版本之前的时间。1在Spring应用。我用这样的东西来定义log4j的位置。属性配置文件驻留: 现在我切换到Log4j ver.2,我有一个XML配置: 但Spring似乎不使用此文件,并且日志记录并没有附加到控制台或数据库中。 这是输出: 我做错了什么?

  • 问题内容: 我想使用新的Log4J 2-Java Logging Framework。一切正常,但是一个小时以来,我尝试加载一个自定义配置文件来配置日志记录(如日志级别)。 这是我的log4j2.xml: 我尝试了以下方法,但没有任何效果: 移动log4j2.xml文件,使其位于默认软件包中。 将log4j2.xml文件移动到项目中的任何位置 将log4j2.xml文件命名为“ log4j.xml

  • Usng maven和Springboot。我希望每个环境(dev、cert)使用不同的文件配置(log4j2.xml、application.properties)。我在pom上创建了两个配置文件。xml文件,我还有两个文件夹,分别放在src/main/resources中,每个文件夹都有文件配置(dev和cert)。我想根据我使用的配置文件包括这些文件。我在目录中有其他文件,所以我不想使用这种

  • 问题内容: 我已将应用程序迁移到log4j 2,并通过log4j2.xml对其进行了配置 但是,我正在使用的某些库取决于log4j1。如果我使用以下命令运行该应用程序: log4j 1抱怨找不到配置文件。我正在使用log4j 2,log4j-1.2-api-2.0-rc1.jar提供的log4j 1.x桥。是否可以使用单个log4j2.xml进行配置? 我尝试过的替代方法是同时配置log4j和lo

  • 我已经将应用程序迁移到Log4J2,并通过log4j2.xml对其进行了配置 但是,我使用的一些库依赖于log4j1。如果我使用以下方式运行应用程序: 我尝试的另一种方法是将log4j和log4j2配置在一起: 我担心的是日志配置文件和输出的碎片化。我还担心log4j.xml和log4j2.xml之间可能存在的冲突。例如,logfile Error.log被配置为使用log4j1中的FileApp