Java 如何在log4j2.02中以编程方式配置记录器?
我想使用log4j而不使用任何配置文件。 我想做的是:Java 如何在log4j2.02中以编程方式配置记录器?,java,log4j,Java,Log4j,我想使用log4j而不使用任何配置文件。 我想做的是: logger = (Logger) LogManager.getLogger(this.getClass()); String pattern = "[%level] %m%n"; //do something to make this logger output to an local file "/xxx/yyy/zzz.log" 我找到了这个答案: 但是Logger#addAppender的文档说: 此方法不是通过公共API公开的,
logger = (Logger) LogManager.getLogger(this.getClass());
String pattern = "[%level] %m%n";
//do something to make this logger output to an local file "/xxx/yyy/zzz.log"
我找到了这个答案:
但是Logger#addAppender
的文档说:
此方法不是通过公共API公开的,主要用于单元测试
我不确定在我的代码中使用此方法是否正确,或者是否有其他更好的解决方案来解决我的问题。如果我只是响应您的要求,我可以建议三个选项。我将第一个用于一种引导记录器配置;然而,一开始我认为第二个是必要的。您的第三个选择似乎很麻烦,因为您需要调用不同的log4japi-s来进行配置 在Java的简单日志框架上使用Log4j
private static final URL LOGGER_CONFIG_URL = resolveConfigUrl();
:
private static URL resolveConfigUrl(){
URL url = LogConfig.class.getResource( LOGGER_CONFIG_NAME );
if( null == url ) // Second chance, try for a file.
{
url = FileHelp.resolveUrlNameAsUrlToFile( LOGGER_CONFIG_NAME );
//-- Make this function with: url = tmpFile.toURI().toURL()
// Plus appropriate try/catch and error checks.
}
return url;
}
private static void configureLogger(){
BasicConfigurator.configure();
PropertyConfigurator.configure( LOGGER_CONFIG_URL );
LOG.info( "Logging config done: " + LOGGER_CONFIG_NAME );
}
final LoggerContext ctx = (LoggerContext) LogManager.getContext(false);
final Configuration config = ctx.getConfiguration();
Layout layout = PatternLayout.createLayout(PatternLayout.SIMPLE_CONVERSION_PATTERN, config, null, null,null, null);
Appender appender = FileAppender.createAppender("target/test.log", "false", "false", "File", "true", "false", "false", "4000", layout, null, "false", null, config);
appender.start();
config.addAppender(appender);
AppenderRef ref = AppenderRef.createAppenderRef("File", null, null);
AppenderRef[] refs = new AppenderRef[] {ref};
LoggerConfig loggerConfig = LoggerConfig.createLogger("false", "info", "org.apache.logging.log4j", "true", refs, null, config, null );
loggerConfig.addAppender(appender, null, null);
config.addLogger("org.apache.logging.log4j", loggerConfig);
ctx.updateLoggers();
有了这些限制:
org.apache.logging.log4j.core.Logger
,并且避免了像这样的脏类型转换:
import org.apache.logging.log4j.Logger;
Logger logger = (Logger) LogManager.getLogger(this.getClass());
((org.apache.logging.log4j.core.Logger) logger).addAppender(...); // Bypassing the public API
使用最新版本的
log4j2
,所有的API都像
PatternLayout.createLayout,
FileAppender.createAppender,
LoggerConfig.createLogger
如果您已弃用,最好使用自定义日志
ConfigurationFactory
和ConfigurationBuilder
以编程方式定义日志配置。如果您计划对记录器jar进行着色以完全隐藏它,请添加为第一行:LogManager.setFactory(新的Log4jContextFactory());现在,您还可以使用阴影过滤器省略所有配置和属性文件?