下面列出了怎么用org.apache.logging.log4j.core.config.builder.api.ComponentBuilder的API类实例代码及写法,或者点击链接到github查看源代码。
private static <B extends ComponentBuilder<?>> B processRemainingProperties(final B builder,
final Properties properties) {
while (properties.size() > 0) {
final String propertyName = properties.stringPropertyNames().iterator().next();
final int index = propertyName.indexOf('.');
if (index > 0) {
final String prefix = propertyName.substring(0, index);
final Properties componentProperties = PropertiesUtil.extractSubset(properties, prefix);
builder.addComponent(createComponent(builder, prefix, componentProperties));
} else {
builder.addAttribute(propertyName, properties.getProperty(propertyName));
properties.remove(propertyName);
}
}
return builder;
}
private void buildDailyRollingFileAppender(final String appenderName) {
final AppenderComponentBuilder appenderBuilder = builder.newAppender(appenderName,
RollingFileAppender.PLUGIN_NAME);
buildFileAppender(appenderName, appenderBuilder);
final String fileName = getLog4jAppenderValue(appenderName, "File");
final String datePattern = getLog4jAppenderValue(appenderName, "DatePattern", fileName + "'.'yyyy-MM-dd");
appenderBuilder.addAttribute("filePattern", fileName + "%d{" + datePattern + "}");
final ComponentBuilder<?> triggeringPolicy = builder.newComponent("Policies")
.addComponent(builder.newComponent("TimeBasedTriggeringPolicy").addAttribute("modulate", true));
appenderBuilder.addComponent(triggeringPolicy);
appenderBuilder
.addComponent(builder.newComponent("DefaultRolloverStrategy").addAttribute("max", Integer.MAX_VALUE));
builder.add(appenderBuilder);
}
private void buildRollingFileAppender(final String appenderName) {
final AppenderComponentBuilder appenderBuilder = builder.newAppender(appenderName,
RollingFileAppender.PLUGIN_NAME);
buildFileAppender(appenderName, appenderBuilder);
final String fileName = getLog4jAppenderValue(appenderName, "File");
appenderBuilder.addAttribute("filePattern", fileName + ".%i");
final String maxFileSizeString = getLog4jAppenderValue(appenderName, "MaxFileSize", "10485760");
final String maxBackupIndexString = getLog4jAppenderValue(appenderName, "MaxBackupIndex", "1");
final ComponentBuilder<?> triggeringPolicy = builder.newComponent("Policies").addComponent(
builder.newComponent("SizeBasedTriggeringPolicy").addAttribute("size", maxFileSizeString));
appenderBuilder.addComponent(triggeringPolicy);
appenderBuilder.addComponent(
builder.newComponent("DefaultRolloverStrategy").addAttribute("max", maxBackupIndexString));
builder.add(appenderBuilder);
}
private void buildAttribute(final String componentName, final ComponentBuilder componentBuilder,
final String sourceAttributeName, final String targetAttributeName) {
final String attributeValue = getLog4jAppenderValue(componentName, sourceAttributeName);
if (attributeValue != null) {
componentBuilder.addAttribute(targetAttributeName, attributeValue);
}
}
private void buildMandatoryAttribute(final String componentName, final ComponentBuilder componentBuilder,
final String sourceAttributeName, final String targetAttributeName) {
final String attributeValue = getLog4jAppenderValue(componentName, sourceAttributeName);
if (attributeValue != null) {
componentBuilder.addAttribute(targetAttributeName, attributeValue);
} else {
reportWarning("Missing " + sourceAttributeName + " for " + componentName);
}
}
private void buildDailyRollingFileAppender(final String appenderName) {
final AppenderComponentBuilder appenderBuilder = builder.newAppender(appenderName,
RollingFileAppender.PLUGIN_NAME);
buildFileAppender(appenderName, appenderBuilder);
final String fileName = getLog4jAppenderValue(appenderName, "File");
final String datePattern = getLog4jAppenderValue(appenderName, "DatePattern", fileName + "'.'yyyy-MM-dd");
appenderBuilder.addAttribute("filePattern", fileName + "%d{" + datePattern + "}");
final ComponentBuilder<?> triggeringPolicy = builder.newComponent("Policies")
.addComponent(builder.newComponent("TimeBasedTriggeringPolicy").addAttribute("modulate", true));
appenderBuilder.addComponent(triggeringPolicy);
appenderBuilder
.addComponent(builder.newComponent("DefaultRolloverStrategy").addAttribute("max", Integer.MAX_VALUE));
builder.add(appenderBuilder);
}
private void buildRollingFileAppender(final String appenderName) {
final AppenderComponentBuilder appenderBuilder = builder.newAppender(appenderName,
RollingFileAppender.PLUGIN_NAME);
buildFileAppender(appenderName, appenderBuilder);
final String fileName = getLog4jAppenderValue(appenderName, "File");
appenderBuilder.addAttribute("filePattern", fileName + ".%i");
final String maxFileSizeString = getLog4jAppenderValue(appenderName, "MaxFileSize", "10485760");
final String maxBackupIndexString = getLog4jAppenderValue(appenderName, "MaxBackupIndex", "1");
final ComponentBuilder<?> triggeringPolicy = builder.newComponent("Policies").addComponent(
builder.newComponent("SizeBasedTriggeringPolicy").addAttribute("size", maxFileSizeString));
appenderBuilder.addComponent(triggeringPolicy);
appenderBuilder.addComponent(
builder.newComponent("DefaultRolloverStrategy").addAttribute("max", maxBackupIndexString));
builder.add(appenderBuilder);
}
private void buildAttribute(final String componentName, final ComponentBuilder componentBuilder,
final String sourceAttributeName, final String targetAttributeName) {
final String attributeValue = getLog4jAppenderValue(componentName, sourceAttributeName);
if (attributeValue != null) {
componentBuilder.addAttribute(targetAttributeName, attributeValue);
}
}
private void buildMandatoryAttribute(final String componentName, final ComponentBuilder componentBuilder,
final String sourceAttributeName, final String targetAttributeName) {
final String attributeValue = getLog4jAppenderValue(componentName, sourceAttributeName);
if (attributeValue != null) {
componentBuilder.addAttribute(targetAttributeName, attributeValue);
} else {
reportWarning("Missing " + sourceAttributeName + " for " + componentName);
}
}
private static <B extends ComponentBuilder<B>> ComponentBuilder<B> createComponent(final ComponentBuilder<?> parent,
final String key,
final Properties properties) {
final String name = (String) properties.remove(CONFIG_NAME);
final String type = (String) properties.remove(CONFIG_TYPE);
if (Strings.isEmpty(type)) {
throw new ConfigurationException("No type attribute provided for component " + key);
}
final ComponentBuilder<B> componentBuilder = parent.getBuilder().newComponent(name, type);
return processRemainingProperties(componentBuilder, properties);
}
private <B extends FilterableComponentBuilder<? extends ComponentBuilder<?>>> B addFiltersToComponent(
final B componentBuilder, final Properties properties) {
final Map<String, Properties> filters = PropertiesUtil.partitionOnCommonPrefixes(
PropertiesUtil.extractSubset(properties, "filter"));
for (final Map.Entry<String, Properties> entry : filters.entrySet()) {
componentBuilder.add(createFilter(entry.getKey().trim(), entry.getValue()));
}
return componentBuilder;
}
private <B extends LoggableComponentBuilder<? extends ComponentBuilder<?>>> B addLoggersToComponent(
final B loggerBuilder, final Properties properties) {
final Map<String, Properties> appenderRefs = PropertiesUtil.partitionOnCommonPrefixes(
PropertiesUtil.extractSubset(properties, "appenderRef"));
for (final Map.Entry<String, Properties> entry : appenderRefs.entrySet()) {
loggerBuilder.add(createAppenderRef(entry.getKey().trim(), entry.getValue()));
}
return loggerBuilder;
}
private static Configuration createConfiguration(final String name, ConfigurationBuilder<BuiltConfiguration> builder) {
System.setProperty("log4j.skipJansi", "false");
builder.setConfigurationName(name);
builder.setStatusLevel(Level.ERROR);
// baseDir for logs
builder.addProperty("baseDir", BHBot.logBaseDir);
// STD OUT
AppenderComponentBuilder stdOutBuilder = builder.newAppender("StdOut", "CONSOLE")
.addAttribute("target", ConsoleAppender.Target.SYSTEM_OUT);
stdOutBuilder.add(builder.newLayout("PatternLayout")
.addAttribute("pattern", "%d{ABSOLUTE} %highlight{%level}{FATAL=bg_red, ERROR=bg_red, WARN=bg_yellow, AUTOBRIBE=cyan, AUTOREVIVE=cyan, AUTOSHRINE=cyan, AUTORUNE=cyan, STATS=magenta, READOUT=yellow, INFO=green, DEBUG=blue} - %msg%n"));
stdOutBuilder.add(builder.newFilter("ThresholdFilter", Filter.Result.DENY,
Filter.Result.ACCEPT).addAttribute("level", Level.ERROR));
builder.add(stdOutBuilder);
// STD ERR
AppenderComponentBuilder stdErrBuilder = builder.newAppender("StdErr", "CONSOLE").
addAttribute("target", ConsoleAppender.Target.SYSTEM_ERR);
stdErrBuilder.add(builder.newLayout("PatternLayout")
.addAttribute("pattern", "%d{ABSOLUTE} %style{%highlight{%level}{FATAL=bg_red, ERROR=red, WARN=bg_yellow, AUTOBRIBE=cyan, AUTOREVIVE=cyan, AUTOSHRINE=cyan, AUTORUNE=cyan, STATS=magenta, READOUT=yellow, INFO=green, DEBUG=blue} - %msg%n}{red}"));
stdErrBuilder.add(builder.newFilter("ThresholdFilter", Filter.Result.ACCEPT,
Filter.Result.DENY).addAttribute("level", Level.ERROR));
builder.add(stdErrBuilder);
// Rolling File
// Composite Triggering Policies
@SuppressWarnings("rawtypes")
ComponentBuilder triggeringPolicy = builder.newComponent("Policies")
.addComponent(builder.newComponent("SizeBasedTriggeringPolicy")
.addAttribute("size", "32M"))
.addComponent(builder.newComponent("TimeBasedTriggeringPolicy"));
// Delete Component to manage old log deletion
@SuppressWarnings("rawtypes")
ComponentBuilder delete = builder.newComponent("Delete")
.addAttribute("basePath", "${baseDir}")
.addAttribute("maxDepth", "2")
//.addAttribute("testMode", true)
.addComponent(builder.newComponent("IfLastModified")
.addAttribute("age", "" + BHBot.logMaxDays + "d"));
// DefaultRolloverStrategy Component
@SuppressWarnings("rawtypes")
ComponentBuilder defaulRolloverStrategy = builder.newComponent("DefaultRolloverStrategy")
.addAttribute("max", BHBot.logMaxDays)
.addAttribute("compressionLevel", 9)
.addComponent(delete);
AppenderComponentBuilder rollingBuilder = builder.newAppender("Rolling", "RollingFile")
.addAttribute("filePattern", "${baseDir}/$${date:yyyy-MM}/BHBot-%d{yyyy-MM-dd}-%i.log.zip")
.addAttribute("fileName", "${baseDir}/bhbot.log");
rollingBuilder.add(builder.newLayout("PatternLayout")
.addAttribute("pattern", "%d [%t] %p %c - %m%n"));
rollingBuilder
.addComponent(triggeringPolicy)
.addComponent(defaulRolloverStrategy);
builder.add(rollingBuilder);
builder.add(
builder.newRootLogger(BHBot.logLevel)
.add(builder.newAppenderRef("StdOut"))
.add(builder.newAppenderRef("StdErr"))
.add(builder.newAppenderRef("Rolling"))
);
return builder.build();
}
static Configuration createConfiguration(final String name, ConfigurationBuilder<BuiltConfiguration> builder) {
AppenderComponentBuilder console = builder.newAppender("Stdout", "Console");
LayoutComponentBuilder layout = builder.newLayout("PatternLayout")
.addAttribute("pattern", "%d [%t] %-5level: %msg%n%throwable");
console.add(layout);
FilterComponentBuilder filter = builder.newFilter("MarkerFilter", Filter.Result.ACCEPT, Filter.Result.DENY);
filter.addAttribute("marker", "FLOW");
console.add(filter);
builder.add(console);
ComponentBuilder triggeringPolicies = builder.newComponent("Policies")
.addComponent(builder.newComponent("CronTriggeringPolicy")
.addAttribute("schedule", "0 0 0 * * ?"))
.addComponent(builder.newComponent("SizeBasedTriggeringPolicy")
.addAttribute("size", "100M"));
AppenderComponentBuilder rollingFile = builder.newAppender("rolling", "RollingFile");
rollingFile.addAttribute("fileName", "target/rolling.log");
rollingFile.addAttribute("filePattern", "target/archive/rolling-%d{MM-dd-yy}.log.gz");
rollingFile.add(layout);
rollingFile.addComponent(triggeringPolicies);
builder.add(rollingFile);
AppenderComponentBuilder file = builder.newAppender("FileSystem", "File");
file.addAttribute("fileName", "target/logging.log");
file.add(layout);
builder.add(file);
LoggerComponentBuilder logger = builder.newLogger("com", Level.DEBUG);
logger.add(builder.newAppenderRef("Stdout"));
logger.add(builder.newAppenderRef("rolling"));
logger.add(builder.newAppenderRef("FileSystem"));
logger.addAttribute("additivity", false);
builder.add(logger);
RootLoggerComponentBuilder rootLogger = builder.newRootLogger(Level.ERROR);
rootLogger.add(builder.newAppenderRef("Stdout"));
rootLogger.add(builder.newAppenderRef("rolling"));
// rootLogger.add(builder.newAppenderRef("syslogAppender"));
rootLogger.add(builder.newAppenderRef("FileSystem"));
rootLogger.addAttribute("additivity", false);
builder.add(rootLogger);
try {
builder.writeXmlConfiguration(System.out);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return builder.build();
}
private void buildAttributeWithDefault(final String componentName, final ComponentBuilder componentBuilder,
final String sourceAttributeName, final String targetAttributeName, final String defaultValue) {
final String attributeValue = getLog4jAppenderValue(componentName, sourceAttributeName, defaultValue);
componentBuilder.addAttribute(targetAttributeName, attributeValue);
}
private void buildAttributeWithDefault(final String componentName, final ComponentBuilder componentBuilder,
final String sourceAttributeName, final String targetAttributeName, final String defaultValue) {
final String attributeValue = getLog4jAppenderValue(componentName, sourceAttributeName, defaultValue);
componentBuilder.addAttribute(targetAttributeName, attributeValue);
}
@Override
@SuppressWarnings("unchecked")
public T addComponent(final ComponentBuilder<?> builder) {
components.add(builder.build());
return (T) this;
}
protected ConfigurationBuilder<T> add(final Component parent, final ComponentBuilder<?> builder) {
parent.getComponents().add(builder.build());
return this;
}
@Override
public <B extends ComponentBuilder<B>> ComponentBuilder<B> newComponent(final String type) {
return new DefaultComponentBuilder<>(this, type);
}
@Override
public <B extends ComponentBuilder<B>> ComponentBuilder<B> newComponent(final String name, final String type) {
return new DefaultComponentBuilder<>(this, name, type);
}
@Override
public <B extends ComponentBuilder<B>> ComponentBuilder<B> newComponent(final String name, final String type,
final String value) {
return new DefaultComponentBuilder<>(this, name, type, value);
}
@Test
public void testRolling() throws Exception {
final ConfigurationBuilder< BuiltConfiguration > builder =
ConfigurationBuilderFactory.newConfigurationBuilder();
builder.setStatusLevel( Level.ERROR);
builder.setConfigurationName("RollingBuilder");
// create the console appender
AppenderComponentBuilder appenderBuilder = builder.newAppender("Stdout", "CONSOLE").addAttribute("target",
ConsoleAppender.Target.SYSTEM_OUT);
appenderBuilder.add(builder.newLayout("PatternLayout").
addAttribute("pattern", "%d [%t] %-5level: %msg%n%throwable"));
builder.add( appenderBuilder );
final LayoutComponentBuilder layoutBuilder = builder.newLayout("PatternLayout")
.addAttribute("pattern", "%d [%t] %-5level: %msg%n");
final ComponentBuilder triggeringPolicy = builder.newComponent("Policies")
.addComponent(builder.newComponent("CronTriggeringPolicy").addAttribute("schedule", "0 0 0 * * ?"))
.addComponent(builder.newComponent("SizeBasedTriggeringPolicy").addAttribute("size", "100M"));
appenderBuilder = builder.newAppender("rolling", "RollingFile")
.addAttribute("fileName", "target/rolling.log")
.addAttribute("filePattern", "target/archive/rolling-%d{MM-dd-yy}.log.gz")
.add(layoutBuilder)
.addComponent(triggeringPolicy);
builder.add(appenderBuilder);
// create the new logger
builder.add( builder.newLogger( "TestLogger", Level.DEBUG )
.add( builder.newAppenderRef( "rolling" ) )
.addAttribute( "additivity", false ) );
builder.add( builder.newRootLogger( Level.DEBUG )
.add( builder.newAppenderRef( "rolling" ) ) );
final Configuration config = builder.build();
config.initialize();
assertNotNull("No rolling file appender", config.getAppender("rolling"));
assertEquals("Unexpected Configuration", "RollingBuilder", config.getName());
// Initialize the new configuration
final LoggerContext ctx = Configurator.initialize( config );
Configurator.shutdown(ctx);
}