首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何将xml应用于从变量获取的log4j2而不是文件?

如何将xml应用于从变量获取的log4j2而不是文件?
EN

Stack Overflow用户
提问于 2021-07-19 13:06:19
回答 1查看 173关注 0票数 0

如何将xml配置应用于从变量获取的log4j2而不是文件?

代码语言:javascript
复制
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();

在这些操作之后,cfg.appenders和cfg.loggerConfigs包含来自loggerConfig (6个附加程序和7个loggerConfigs)的数据,但是log4j2系统不能工作。Xml数据很好,因为当我以下列方式从资源文件读取这些数据时,log4j2系统可以工作。

代码语言:javascript
复制
ctx.setConfigLocation(instance.getClass().getResource(getLoggerConfigFileName()).toURI());

--示例代码--

我已经将配置简化为一个记录器和一个附录,在init2中,我从文件中读取xml,而不是使用字节数组。我认为,使init2可行可以为原来的问题提供解决方案。当前版本的init2将日志写入控制台,而不是配置的文件(init1正确写入配置文件)。我可能不正确地使用ConfigurationSource/XmlConfiguration类初始化log4j2系统。有什么办法解决吗?我更喜欢提到的课程,但我可以尝试使用其他的

log4j.xml:

代码语言:javascript
复制
<?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>

log4j2v1.java:

代码语言:javascript
复制
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) {
        }
    }
}

init1方法初始化log4j2系统,init2方法不初始化log4j2。

必需的库: log4j-api-2.14.1.jar,log4j-core-2.14.1.jar,干扰器-3.4.4jar

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-07-22 18:20:38

似乎是命令使魔法

代码语言:javascript
复制
Configurator.reconfigure(cfg);

所以固定的init2方法应该是

代码语言:javascript
复制
    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) {
        }
    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68441006

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档