我如何为从变量而不是文件中获取的 log4j2 应用 xml 配置?
How could I apply xml config for log4j2 taken from variable instead of file?
如何为从变量而不是文件中获取的 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();
在这些操作之后 cfg.appenders 和 cfg.loggerConfigs 包含来自 loggerConfig 的数据(6 个 appenders 和 7 个 loggerConfigs)但是 log4j2 系统不工作。 Xml 数据相当不错,因为当我按以下方式从资源文件中读取这些数据时,log4j2 系统工作正常
ctx.setConfigLocation(instance.getClass().getResource(getLoggerConfigFileName()).toURI());
---示例代码---
我已将配置缩减为一个记录器和一个追加器,在 init2 中我从文件中读取 xml 而不是使用字节数组。我假设使 init2 可行可以解决原始问题。当前版本的 init2 将日志写入控制台而不是配置文件(init1 正确写入配置文件)。我可能不正确地使用 ConfigurationSource/XmlConfiguration 类 来初始化 log4j2 系统。任何想法如何解决它?我更喜欢提到 类 但我可以尝试使用其他
log4j.xml:
<?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:
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、disruptor-3.4.4.jar
看起来神奇的命令是
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 应用 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();
在这些操作之后 cfg.appenders 和 cfg.loggerConfigs 包含来自 loggerConfig 的数据(6 个 appenders 和 7 个 loggerConfigs)但是 log4j2 系统不工作。 Xml 数据相当不错,因为当我按以下方式从资源文件中读取这些数据时,log4j2 系统工作正常
ctx.setConfigLocation(instance.getClass().getResource(getLoggerConfigFileName()).toURI());
---示例代码---
我已将配置缩减为一个记录器和一个追加器,在 init2 中我从文件中读取 xml 而不是使用字节数组。我假设使 init2 可行可以解决原始问题。当前版本的 init2 将日志写入控制台而不是配置文件(init1 正确写入配置文件)。我可能不正确地使用 ConfigurationSource/XmlConfiguration 类 来初始化 log4j2 系统。任何想法如何解决它?我更喜欢提到 类 但我可以尝试使用其他
log4j.xml:
<?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:
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、disruptor-3.4.4.jar
看起来神奇的命令是
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) {
}
}