Я создал файл журнала с пользовательским ConfigurationFactory
и для переопределения элементов из файла конфигурации XML, который находится в том же банке (файл log4j2.xml). У меня есть другой файл (log4j2-prod.xml), который должен быть переопределен, и его конфигурация должна использоваться в производственных средах. Как можно условно установить, какую конфигурацию следует использовать log4j2?
пример моей фабрики пользовательских настроек:
@Plugin(
name = "CustomConfigurationFactory",
category = ConfigurationFactory.CATEGORY)
@Order(50)
public class CustomConfigFactory extends ConfigurationFactory {
@Override
protected String[] getSupportedTypes() {
return new String[] {".xml"};
}
@Override
public Configuration getConfiguration(LoggerContext loggerContext,
ConfigurationSource source) {
if(source.getLocation().contains("log4j2.xml")) {
return null;
} else {
return new CustomXmlConfig(loggerContext, source);
}
}
public class CustomXmlConfig extends XmlConfiguration {
public CustomXmlConfig(LoggerContext loggerContext, ConfigurationSource configSource) {
super(loggerContext, configSource);
}
@Override
protected void doConfigure() {
if (this.getName().contains("log4j2.xml")) {
final InputStream systemResourceAsStream = ClassLoader.getSystemResourceAsStream("config/application.yaml");
String substring1 = null;
try {
final String s = IOUtils.toString(systemResourceAsStream, StandardCharsets.UTF_8.name());
int startIndex = s.indexOf("logger.package-name:");
final String substring = s.substring(startIndex + "logger.package-name:".length() + 1);
substring1 = substring.substring(0, substring.indexOf('\n')).trim();
System.out.println(substring1);
} catch (IOException e) {
e.printStackTrace();
}
MDC.put("tenantId", "tenant1234");
MDC.put("taskId", "task123");
if(getRootNode().getChildren() != null) {
getRootNode().getChildren().get(0).getChildren().get(0).setValue(pattern);
getRootNode().getChildren().get(2).getChildren().get(0).getAttributes().put("name", substring1);
}
}
super.doConfigure();
}
}
}