下面列出了org.apache.logging.log4j.core.config.builder.impl.BuiltConfiguration#org.apache.logging.log4j.core.config.builder.api.AppenderComponentBuilder 实例代码,或者点击链接到github查看源代码,也可以在右侧发表评论。
private List<AppenderComponentBuilder> createAppenders(ConfigurationBuilder<BuiltConfiguration> builder) {
List<AppenderComponentBuilder> appenders = new ArrayList<>();
String logFile = getActualLogFile(ElasticApmAgent.getAgentHome(), getValue(LOG_FILE_KEY, sources, getValue(DEPRECATED_LOG_FILE_KEY, sources, DEFAULT_LOG_FILE)));
if (logFile.equals(SYSTEM_OUT)) {
appenders.add(createConsoleAppender(builder));
if (Boolean.parseBoolean(getValue(SHIP_AGENT_LOGS, sources, Boolean.TRUE.toString()))) {
File tempLog = getTempLogFile(ephemeralId);
tempLog.deleteOnExit();
File rotatedTempLog = new File(tempLog + ".1");
rotatedTempLog.deleteOnExit();
appenders.add(createFileAppender(builder, tempLog.getAbsolutePath(), createLayout(builder, LogFormat.JSON)));
}
} else {
appenders.add(createFileAppender(builder, logFile, createLayout(builder, getFileLogFormat())));
}
for (AppenderComponentBuilder appender : appenders) {
builder.add(appender);
}
return appenders;
}
private AppenderComponentBuilder createFileAppender(ConfigurationBuilder<BuiltConfiguration> builder, String logFile, LayoutComponentBuilder layout) {
ByteValue size = ByteValue.of(getValue("log_file_size", sources, LoggingConfiguration.DEFAULT_MAX_SIZE));
return builder.newAppender("rolling", "RollingFile")
.addAttribute("fileName", logFile)
.addAttribute("filePattern", logFile + ".%i")
.add(layout)
.addComponent(builder.newComponent("Policies")
.addComponent(builder.newComponent("SizeBasedTriggeringPolicy").addAttribute("size", size.getBytes() + "B")))
// Always keep exactly one history file.
// This is needed to ensure that the rest of the file can be sent when its rotated.
// Storing multiple history files would give the false impression that, for example,
// when currently reading from apm.log2, the reading would continue from apm.log1.
// This is not the case, when apm.log2 is fully read, the reading will continue from apm.log.
// That is because we don't want to require the reader having to know the file name pattern of the rotated file.
.addComponent(builder.newComponent("DefaultRolloverStrategy").addAttribute("max", 1));
}
@Test
public void givenDefaultLog4j2Environment_whenProgrammaticallyConfigured_thenLogsCorrectly() {
ConfigurationBuilder<BuiltConfiguration> builder = ConfigurationBuilderFactory.newConfigurationBuilder();
AppenderComponentBuilder console = builder.newAppender("Stdout", "CONSOLE")
.addAttribute("target", ConsoleAppender.Target.SYSTEM_OUT);
console.add(builder.newLayout("PatternLayout")
.addAttribute("pattern", "%d [%t] %-5level: %msg%n%throwable"));
builder.add(console);
builder.add(builder.newLogger("com", Level.DEBUG)
.add(builder.newAppenderRef("Stdout"))
.addAttribute("additivity", false));
builder.add(builder.newRootLogger(Level.ERROR)
.add(builder.newAppenderRef("Stdout")));
Configurator.initialize(builder.build());
LogPrinter logPrinter = new LogPrinter();
logPrinter.printlog();
}
private AppenderComponentBuilder createAppender(final String key, final Properties properties) {
final String name = (String) properties.remove(CONFIG_NAME);
if (Strings.isEmpty(name)) {
throw new ConfigurationException("No name attribute provided for Appender " + key);
}
final String type = (String) properties.remove(CONFIG_TYPE);
if (Strings.isEmpty(type)) {
throw new ConfigurationException("No type attribute provided for Appender " + key);
}
final AppenderComponentBuilder appenderBuilder = builder.newAppender(name, type);
addFiltersToComponent(appenderBuilder, properties);
final Properties layoutProps = PropertiesUtil.extractSubset(properties, "layout");
if (layoutProps.size() > 0) {
appenderBuilder.add(createLayout(name, layoutProps));
}
return processRemainingProperties(appenderBuilder, properties);
}
@Test
public void testBuilder() throws Exception {
final ConfigurationBuilder<BuiltConfiguration> builder = ConfigurationBuilderFactory.newConfigurationBuilder();
builder.setStatusLevel(Level.ERROR);
builder.setConfigurationName("BuilderTest");
builder.add(builder.newFilter("ThresholdFilter", Filter.Result.ACCEPT, Filter.Result.NEUTRAL)
.addAttribute("level", Level.DEBUG));
final 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"));
appenderBuilder.add(builder.newFilter("MarkerFilter", Filter.Result.DENY,
Filter.Result.NEUTRAL).addAttribute("marker", "FLOW"));
builder.add(appenderBuilder);
builder.add(builder.newLogger("org.apache.logging.log4j", Level.DEBUG).
add(builder.newAppenderRef("Stdout")).
addAttribute("additivity", false));
builder.add(builder.newRootLogger(Level.ERROR).add(builder.newAppenderRef("Stdout")));
ctx = Configurator.initialize(builder.build());
final Configuration config = ctx.getConfiguration();
assertNotNull("No configuration", config);
assertEquals("Unexpected Configuration", "BuilderTest", config.getName());
assertThat(config.getAppenders(), hasSize(equalTo(1)));
}
private void addTestFixtures(final String name, final ConfigurationBuilder<BuiltConfiguration> builder) {
builder.setConfigurationName(name);
builder.setStatusLevel(Level.ERROR);
builder.setShutdownTimeout(5000, TimeUnit.MILLISECONDS);
builder.add(builder.newScriptFile("target/test-classes/scripts/filter.groovy").addIsWatched(true));
builder.add(builder.newFilter("ThresholdFilter", Filter.Result.ACCEPT, Filter.Result.NEUTRAL)
.addAttribute("level", Level.DEBUG));
final 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"));
appenderBuilder.add(builder.newFilter("MarkerFilter", Filter.Result.DENY,
Filter.Result.NEUTRAL).addAttribute("marker", "FLOW"));
builder.add(appenderBuilder);
builder.add(builder.newLogger("org.apache.logging.log4j", Level.DEBUG, true).
add(builder.newAppenderRef("Stdout")).
addAttribute("additivity", false));
builder.add(builder.newLogger("org.apache.logging.log4j.core").
add(builder.newAppenderRef("Stdout")));
builder.add(builder.newRootLogger(Level.ERROR).add(builder.newAppenderRef("Stdout")));
builder.addProperty("MyKey", "MyValue");
builder.add(builder.newCustomLevel("Panic", 17));
builder.setPackages("foo,bar");
}
public static Configuration addTestFixtures(final String name, final ConfigurationBuilder<BuiltConfiguration> builder) {
builder.setConfigurationName(name);
builder.setStatusLevel(Level.ERROR);
builder.add(builder.newScriptFile("target/test-classes/scripts/filter.groovy").addIsWatched(true));
builder.add(builder.newFilter("ThresholdFilter", Filter.Result.ACCEPT, Filter.Result.NEUTRAL)
.addAttribute("level", Level.DEBUG));
final 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"));
appenderBuilder.add(builder.
newFilter("MarkerFilter", Filter.Result.DENY, Filter.Result.NEUTRAL).
addAttribute("marker", "FLOW"));
builder.add(appenderBuilder);
builder.add(builder.newLogger("org.apache.logging.log4j", Level.DEBUG, true).
add(builder.newAppenderRef("Stdout")).
addAttribute("additivity", false));
builder.add(builder.newRootLogger(Level.ERROR).add(builder.newAppenderRef("Stdout")));
builder.add(builder.newCustomLevel("Panic", 17));
return builder.build();
}
public Configuration getConfiguration() {
ConfigurationBuilder<BuiltConfiguration> builder = newConfigurationBuilder();
builder.setStatusLevel(Level.ERROR)
.setConfigurationName("ElasticAPM");
Level level = Level.valueOf(getValue(LOG_LEVEL_KEY, sources, getValue(DEPRECATED_LOG_LEVEL_KEY, sources, Level.INFO.toString())));
RootLoggerComponentBuilder rootLogger = builder.newRootLogger(level);
List<AppenderComponentBuilder> appenders = createAppenders(builder);
for (AppenderComponentBuilder appender : appenders) {
rootLogger.add(builder.newAppenderRef(appender.getName()));
}
builder.add(rootLogger);
return builder.build();
}
private Configuration createConfiguration(final String name, ConfigurationBuilder<BuiltConfiguration> builder) {
builder.setConfigurationName(name);
builder.setStatusLevel(Level.ERROR);
builder.add(builder.newFilter("ThresholdFilter", Filter.Result.ACCEPT, Filter.Result.NEUTRAL).addAttribute("level", level()));
if (isConsoleAppenderEnabled()) {
AppenderComponentBuilder appenderBuilder = builder.newAppender("Stdout", "CONSOLE").addAttribute("target", ConsoleAppender.Target.SYSTEM_OUT);
appenderBuilder.add(builder.newLayout("PatternLayout").addAttribute("pattern", "%d [%t] %-5level: %msg [%c][%X{msgId}]%n%throwable"));
appenderBuilder.add(builder.newFilter("MarkerFilter", Filter.Result.DENY, Filter.Result.NEUTRAL).addAttribute("marker", "FLOW"));
builder.add(appenderBuilder);
}
builder.add(builder.newLogger("org.apache.logging.log4j", Level.DEBUG).add(builder.newAppenderRef("Stdout")).addAttribute("additivity", false));
builder.add(builder.newRootLogger(Level.ERROR).add(builder.newAppenderRef("Stdout")));
return builder.build();
}
public static void initialize(String logLevel) {
if (System.getProperty(LOG4J_CONFIGURATION_FILE) == null) {
ConfigurationBuilder<BuiltConfiguration> builder = ConfigurationBuilderFactory.newConfigurationBuilder()
.setStatusLevel(Level.ERROR)
.setConfigurationName(LOG4J_CONFIGURATION_NAME);
AppenderComponentBuilder appenderBuilder = builder.newAppender(APPENDER_NAME, APPENDER_PLUGIN_TYPE)
.add(builder.newLayout(APPENDER_LAYOUT_PLUGIN_TYPE)
.addAttribute(APPENDER_PATTERN_KEY, APPENDER_PATTERN_VALUE));
builder.add(appenderBuilder);
switch (logLevel) {
case TRACE_LOG_LEVEL:
builder.add(builder.newRootLogger(Level.TRACE).add(builder.newAppenderRef(APPENDER_NAME)));
break;
case DEBUG_LOG_LEVEL:
builder.add(builder.newRootLogger(Level.DEBUG).add(builder.newAppenderRef(APPENDER_NAME)));
break;
case INFO_LOG_LEVEL:
builder.add(builder.newRootLogger(Level.INFO).add(builder.newAppenderRef(APPENDER_NAME)));
break;
case WARN_LOG_LEVEL:
builder.add(builder.newRootLogger(Level.WARN).add(builder.newAppenderRef(APPENDER_NAME)));
break;
default:
builder.add(builder.newRootLogger(Level.ERROR).add(builder.newAppenderRef(APPENDER_NAME)));
break;
}
Configurator.initialize(builder.build());
}
}
public static LoggerContext initializeLog4j() {
ConfigurationBuilder<BuiltConfiguration> builder = ConfigurationBuilderFactory.newConfigurationBuilder();
builder.setStatusLevel(Level.ERROR); // show internal log4j2 errors
builder.setConfigurationName("QuickAndDirtySetup");
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);
//builder.add(builder.newLogger("org.apache.logging.log4j", Level.DEBUG)
// .add(builder.newAppenderRef("Stdout")).addAttribute("additivity", false));
builder.add(builder.newRootLogger(Level.ERROR).add(builder.newAppenderRef("Stdout").addAttribute("level", Level.WARN)));
return Configurator.initialize(builder.build());
}
public static LoggerContext initializeLog4j() {
ConfigurationBuilder<BuiltConfiguration> builder = ConfigurationBuilderFactory.newConfigurationBuilder();
builder.setStatusLevel(Level.ERROR); // show internal log4j2 errors
builder.setConfigurationName("QuickAndDirtySetup");
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);
//builder.add(builder.newLogger("org.apache.logging.log4j", Level.DEBUG)
// .add(builder.newAppenderRef("Stdout")).addAttribute("additivity", false));
builder.add(builder.newRootLogger(Level.ERROR).add(builder.newAppenderRef("Stdout").addAttribute("level", Level.WARN)));
return Configurator.initialize(builder.build());
}
public static Logger initializeFileLogger(String fileName, Level level, Class<?> clazz) {
final ConfigurationBuilder<BuiltConfiguration> builder =
ConfigurationBuilderFactory.newConfigurationBuilder();
final AppenderComponentBuilder appenderBuilder =
builder.newAppender("file", "File").addAttribute("fileName", fileName);
builder.add(appenderBuilder);
builder.add(
builder.newLogger(clazz.getCanonicalName(), level).add(builder.newAppenderRef("file")));
builder.add(builder.newRootLogger(level).add(builder.newAppenderRef("file")));
final LoggerContext ctx = Configurator.initialize(builder.build());
return LogManager.getLogger(clazz);
}
private void addTestFixtures(final String name, final ConfigurationBuilder<BuiltConfiguration> builder) {
builder.setConfigurationName(name);
builder.setStatusLevel(Level.ERROR);
builder.setShutdownTimeout(5000, TimeUnit.MILLISECONDS);
builder.add(builder.newScriptFile("target/test-classes/scripts/filter.groovy").addIsWatched(true));
builder.add(builder.newFilter("ThresholdFilter", Filter.Result.ACCEPT, Filter.Result.NEUTRAL)
.addAttribute("level", Level.DEBUG));
final 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"));
appenderBuilder.add(builder.newFilter("MarkerFilter", Filter.Result.DENY,
Filter.Result.NEUTRAL).addAttribute("marker", "FLOW"));
builder.add(appenderBuilder);
final AppenderComponentBuilder appenderBuilder2 = builder.newAppender("Pulsar", "Pulsar")
.addAttribute("serviceUrl", "pulsar://localhost:6650")
.addAttribute("topic", "my-topic");
appenderBuilder2.add(builder.newLayout("GelfLayout").
addAttribute("host", "my-host").
addComponent(builder.newKeyValuePair("extraField", "extraValue")));
builder.add(appenderBuilder2);
builder.add(builder.newLogger("org.apache.logging.log4j", Level.DEBUG, true).
add(builder.newAppenderRef("Stdout")).
addAttribute("additivity", false));
builder.add(builder.newLogger("org.apache.logging.log4j.core", Level.DEBUG).
add(builder.newAppenderRef("Stdout")));
builder.add(builder.newRootLogger(Level.ERROR).add(builder.newAppenderRef("Stdout")));
builder.addProperty("MyKey", "MyValue");
builder.add(builder.newCustomLevel("Panic", 17));
builder.setPackages("foo,bar");
}
static Configuration addTestFixtures(final String name, final ConfigurationBuilder<BuiltConfiguration> builder) {
builder.setConfigurationName(name);
builder.setStatusLevel(Level.ERROR);
builder.add(builder.newScriptFile("target/test-classes/scripts/filter.groovy").addIsWatched(true));
builder.add(builder.newFilter("ThresholdFilter", Filter.Result.ACCEPT, Filter.Result.NEUTRAL)
.addAttribute("level", Level.DEBUG));
final 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"));
appenderBuilder.add(builder.newFilter("MarkerFilter", Filter.Result.DENY,
Filter.Result.NEUTRAL).addAttribute("marker", "FLOW"));
builder.add(appenderBuilder);
final AppenderComponentBuilder appenderBuilder2 = builder.newAppender("Pulsar", "Pulsar")
.addAttribute("serviceUrl", "pulsar://localhost:6650")
.addAttribute("topic", "my-topic");
appenderBuilder2.add(builder.newLayout("GelfLayout").
addAttribute("host", "my-host").
addComponent(builder.newKeyValuePair("extraField", "extraValue")));
builder.add(appenderBuilder2);
builder.add(builder.newLogger("org.apache.logging.log4j", Level.DEBUG, true).
add(builder.newAppenderRef("Stdout")).
addAttribute("additivity", false));
builder.add(builder.newRootLogger(Level.ERROR).add(builder.newAppenderRef("Stdout")));
builder.add(builder.newCustomLevel("Panic", 17));
return builder.build();
}
private void buildConsoleAppender(final String appenderName) {
final AppenderComponentBuilder appenderBuilder = builder.newAppender(appenderName, ConsoleAppender.PLUGIN_NAME);
final String targetValue = getLog4jAppenderValue(appenderName, "Target", "System.out");
if (targetValue != null) {
final ConsoleAppender.Target target;
switch (targetValue) {
case "System.out":
target = ConsoleAppender.Target.SYSTEM_OUT;
break;
case "System.err":
target = ConsoleAppender.Target.SYSTEM_ERR;
break;
default:
reportWarning("Unknown value for console Target: " + targetValue);
target = null;
}
if (target != null) {
appenderBuilder.addAttribute("target", target);
}
}
buildAttribute(appenderName, appenderBuilder, "Follow", "follow");
if (FALSE.equalsIgnoreCase(getLog4jAppenderValue(appenderName, "ImmediateFlush"))) {
reportWarning("ImmediateFlush=false is not supported on Console appender");
}
buildAppenderLayout(appenderName, appenderBuilder);
builder.add(appenderBuilder);
}
private void buildFileAppender(final String appenderName, final AppenderComponentBuilder appenderBuilder) {
buildMandatoryAttribute(appenderName, appenderBuilder, "File", "fileName");
buildAttribute(appenderName, appenderBuilder, "Append", "append");
buildAttribute(appenderName, appenderBuilder, "BufferedIO", "bufferedIo");
buildAttribute(appenderName, appenderBuilder, "BufferSize", "bufferSize");
buildAttribute(appenderName, appenderBuilder, "ImmediateFlush", "immediateFlush");
buildAppenderLayout(appenderName, appenderBuilder);
}
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 buildConsoleAppender(final String appenderName) {
final AppenderComponentBuilder appenderBuilder = builder.newAppender(appenderName, ConsoleAppender.PLUGIN_NAME);
final String targetValue = getLog4jAppenderValue(appenderName, "Target", "System.out");
if (targetValue != null) {
final ConsoleAppender.Target target;
switch (targetValue) {
case "System.out":
target = ConsoleAppender.Target.SYSTEM_OUT;
break;
case "System.err":
target = ConsoleAppender.Target.SYSTEM_ERR;
break;
default:
reportWarning("Unknown value for console Target: " + targetValue);
target = null;
}
if (target != null) {
appenderBuilder.addAttribute("target", target);
}
}
buildAttribute(appenderName, appenderBuilder, "Follow", "follow");
if (FALSE.equalsIgnoreCase(getLog4jAppenderValue(appenderName, "ImmediateFlush"))) {
reportWarning("ImmediateFlush=false is not supported on Console appender");
}
buildAppenderLayout(appenderName, appenderBuilder);
builder.add(appenderBuilder);
}
private void buildFileAppender(final String appenderName, final AppenderComponentBuilder appenderBuilder) {
buildMandatoryAttribute(appenderName, appenderBuilder, "File", "fileName");
buildAttribute(appenderName, appenderBuilder, "Append", "append");
buildAttribute(appenderName, appenderBuilder, "BufferedIO", "bufferedIo");
buildAttribute(appenderName, appenderBuilder, "BufferSize", "bufferSize");
buildAttribute(appenderName, appenderBuilder, "ImmediateFlush", "immediateFlush");
buildAppenderLayout(appenderName, appenderBuilder);
}
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 addTestFixtures(final String name, final ConfigurationBuilder<BuiltConfiguration> builder) {
builder.setConfigurationName(name);
builder.setStatusLevel(Level.ERROR);
builder.setShutdownTimeout(5000, TimeUnit.MILLISECONDS);
builder.add(builder.newScriptFile("target/test-classes/scripts/filter.groovy").addIsWatched(true));
builder.add(builder.newFilter("ThresholdFilter", Filter.Result.ACCEPT, Filter.Result.NEUTRAL)
.addAttribute("level", Level.DEBUG));
final 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"));
appenderBuilder.add(builder.newFilter("MarkerFilter", Filter.Result.DENY,
Filter.Result.NEUTRAL).addAttribute("marker", "FLOW"));
builder.add(appenderBuilder);
final AppenderComponentBuilder appenderBuilder2 = builder.newAppender("Kafka", "Kafka").addAttribute("topic", "my-topic");
appenderBuilder2.addComponent(builder.newProperty("bootstrap.servers", "localhost:9092"));
appenderBuilder2.add(builder.newLayout("GelfLayout").
addAttribute("host", "my-host").
addComponent(builder.newKeyValuePair("extraField", "extraValue")));
builder.add(appenderBuilder2);
builder.add(builder.newLogger("org.apache.logging.log4j", Level.DEBUG, true).
add(builder.newAppenderRef("Stdout")).
addAttribute("additivity", false));
builder.add(builder.newLogger("org.apache.logging.log4j.core").
add(builder.newAppenderRef("Stdout")));
builder.add(builder.newRootLogger(Level.ERROR).add(builder.newAppenderRef("Stdout")));
builder.addProperty("MyKey", "MyValue");
builder.add(builder.newCustomLevel("Panic", 17));
builder.setPackages("foo,bar");
}
static Configuration addTestFixtures(final String name, final ConfigurationBuilder<BuiltConfiguration> builder) {
builder.setConfigurationName(name);
builder.setStatusLevel(Level.ERROR);
builder.add(builder.newScriptFile("target/test-classes/scripts/filter.groovy").addIsWatched(true));
builder.add(builder.newFilter("ThresholdFilter", Filter.Result.ACCEPT, Filter.Result.NEUTRAL)
.addAttribute("level", Level.DEBUG));
final 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"));
appenderBuilder.add(builder.newFilter("MarkerFilter", Filter.Result.DENY,
Filter.Result.NEUTRAL).addAttribute("marker", "FLOW"));
builder.add(appenderBuilder);
final AppenderComponentBuilder appenderBuilder2 = builder.newAppender("Kafka", "Kafka").addAttribute("topic", "my-topic");
appenderBuilder2.addComponent(builder.newProperty("bootstrap.servers", "localhost:9092"));
appenderBuilder2.add(builder.newLayout("GelfLayout").
addAttribute("host", "my-host").
addComponent(builder.newKeyValuePair("extraField", "extraValue")));
builder.add(appenderBuilder2);
builder.add(builder.newLogger("org.apache.logging.log4j", Level.DEBUG, true).
add(builder.newAppenderRef("Stdout")).
addAttribute("additivity", false));
builder.add(builder.newRootLogger(Level.ERROR).add(builder.newAppenderRef("Stdout")));
builder.add(builder.newCustomLevel("Panic", 17));
return builder.build();
}
@Test
public void testBuilderWithScripts() throws Exception {
final String script = "if (logEvent.getLoggerName().equals(\"NoLocation\")) {\n" +
" return \"NoLocation\";\n" +
" } else if (logEvent.getMarker() != null && logEvent.getMarker().isInstanceOf(\"FLOW\")) {\n" +
" return \"Flow\";\n" +
" } else {\n" +
" return null;\n" +
" }";
final ConfigurationBuilder<BuiltConfiguration> builder = ConfigurationBuilderFactory.newConfigurationBuilder();
builder.setStatusLevel(Level.ERROR);
builder.setConfigurationName("BuilderTest");
builder.add(builder.newScriptFile("filter.groovy", "target/test-classes/scripts/filter.groovy").addIsWatched(true));
final AppenderComponentBuilder appenderBuilder = builder.newAppender("Stdout", "CONSOLE").addAttribute("target",
ConsoleAppender.Target.SYSTEM_OUT);
appenderBuilder.add(builder.newLayout("PatternLayout").
addComponent(builder.newComponent("ScriptPatternSelector")
.addAttribute("defaultPattern", "[%-5level] %c{1.} %C{1.}.%M.%L %msg%n")
.addComponent(builder.newComponent("PatternMatch").addAttribute("key", "NoLocation")
.addAttribute("pattern", "[%-5level] %c{1.} %msg%n"))
.addComponent(builder.newComponent("PatternMatch").addAttribute("key", "FLOW")
.addAttribute("pattern", "[%-5level] %c{1.} ====== %C{1.}.%M:%L %msg ======%n"))
.addComponent(builder.newComponent("selectorScript", "Script", script).addAttribute("language", "beanshell"))));
appenderBuilder.add(builder.newFilter("ScriptFilter", Filter.Result.DENY,
Filter.Result.NEUTRAL).addComponent(builder.newComponent("ScriptRef").addAttribute("ref", "filter.groovy")));
builder.add(appenderBuilder);
builder.add(builder.newLogger("org.apache.logging.log4j", Level.DEBUG).
add(builder.newAppenderRef("Stdout")).
addAttribute("additivity", false));
builder.add(builder.newRootLogger(Level.ERROR).add(builder.newAppenderRef("Stdout")));
ctx = Configurator.initialize(builder.build());
final Configuration config = ctx.getConfiguration();
assertNotNull("No configuration", config);
assertEquals("Unexpected Configuration", "BuilderTest", config.getName());
assertThat(config.getAppenders(), hasSize(equalTo(1)));
assertNotNull("Filter script not found", config.getScriptManager().getScript("filter.groovy"));
assertNotNull("pattern selector script not found", config.getScriptManager().getScript("selectorScript"));
}
private AppenderComponentBuilder createConsoleAppender(ConfigurationBuilder<BuiltConfiguration> builder) {
return builder.newAppender("Stdout", "CONSOLE")
.addAttribute("target", ConsoleAppender.Target.SYSTEM_OUT)
.add(createLayout(builder, getSoutLogFormat()));
}
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 buildFileAppender(final String appenderName) {
final AppenderComponentBuilder appenderBuilder = builder.newAppender(appenderName, FileAppender.PLUGIN_NAME);
buildFileAppender(appenderName, appenderBuilder);
builder.add(appenderBuilder);
}