有一種方法可能不是完美的,但我認爲它能夠滿足您的需求。
這裏有一個簡單的例子:
Log4j2.java
package test;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.core.config.plugins.util.PluginManager;
public class Log4j2 {
private static Logger logger = LogManager.getLogger();
public static void main(String[] args) {
logger.info("hello");
}
}
CustomConfigurationFactory.java
package test;
import java.net.URI;
import org.apache.logging.log4j.Level;
import org.apache.logging.log4j.core.LoggerContext;
import org.apache.logging.log4j.core.appender.ConsoleAppender;
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.builder.api.AppenderComponentBuilder;
import org.apache.logging.log4j.core.config.builder.api.ConfigurationBuilder;
import org.apache.logging.log4j.core.config.builder.api.RootLoggerComponentBuilder;
import org.apache.logging.log4j.core.config.builder.impl.BuiltConfiguration;
import org.apache.logging.log4j.core.config.plugins.Plugin;
@Plugin(name = "CustomConfigurationFactory", category = ConfigurationFactory.CATEGORY)
@Order(0)
public class CustomConfigurationFactory extends ConfigurationFactory {
private static Configuration createConfiguration(
final String name, ConfigurationBuilder<BuiltConfiguration> builder) {
builder.setConfigurationName(name);
AppenderComponentBuilder appenderBuilder =
builder
.newAppender("Stdout", "CONSOLE")
.addAttribute("target", ConsoleAppender.Target.SYSTEM_OUT);
appenderBuilder.add(
builder.newLayout("PatternLayout").addAttribute("pattern", "%level: %msg%n"));
builder.add(appenderBuilder);
RootLoggerComponentBuilder rootLoggerBuilder = builder.newRootLogger(Level.DEBUG);
rootLoggerBuilder.add(builder.newAppenderRef("Stdout"));
builder.add(rootLoggerBuilder);
return builder.build();
}
@Override
public Configuration getConfiguration(
final LoggerContext loggerContext, final ConfigurationSource source) {
return getConfiguration(loggerContext, source.toString(), null);
}
@Override
public Configuration getConfiguration(
final LoggerContext loggerContext, final String name, final URI configLocation) {
ConfigurationBuilder<BuiltConfiguration> builder = newConfigurationBuilder();
return createConfiguration(name, builder);
}
@Override
protected String[] getSupportedTypes() {
return new String[] {".code"}; // IMPORTANT
}
}
然後創建一個名爲log4j2.code在一個空文件10。
注:
最重要的是要確保您的自定義log4j2配置資源文件的suffix
對應於CustomConfigurationFactory.getSupportedTypes
方法的返回值。
UPDATE
如果log4j2水溼找到CustomConfigurationFactory
插件,嘗試啓用註釋處理。
+ q放置某種標記文件對我來說可以。不幸的是我注意到我無法確保第一個在我的上下文中調用Logger,因此ConfigurationFactory解決方案可能不會工作,因爲log4j2默認配置已經完成了,對嗎? – FrVaBe
不需要調用'PluginManager.addPackage'方法,因爲log4j-core-2。*。jar中的PluginProcessor會自動掃描自定義插件。你可以試試。 – wangyuntao
我已更新我的回答 – wangyuntao