下面列出了怎么用org.apache.logging.log4j.core.Appender的API类实例代码及写法,或者点击链接到github查看源代码。
@Test
public void testListAppender() throws Exception {
LoggerContext loggerContext = configure("target/test-classes/log4j1-list.properties");
Logger logger = LogManager.getLogger("test");
logger.debug("This is a test of the root logger");
Configuration configuration = loggerContext.getConfiguration();
Map<String, Appender> appenders = configuration.getAppenders();
ListAppender eventAppender = null;
ListAppender messageAppender = null;
for (Map.Entry<String, Appender> entry : appenders.entrySet()) {
if (entry.getKey().equals("list")) {
messageAppender = (ListAppender) ((AppenderAdapter.Adapter) entry.getValue()).getAppender();
} else if (entry.getKey().equals("events")) {
eventAppender = (ListAppender) ((AppenderAdapter.Adapter) entry.getValue()).getAppender();
}
}
assertNotNull("No Event Appender", eventAppender);
assertNotNull("No Message Appender", messageAppender);
List<LoggingEvent> events = eventAppender.getEvents();
assertTrue("No events", events != null && events.size() > 0);
List<String> messages = messageAppender.getMessages();
assertTrue("No messages", messages != null && messages.size() > 0);
}
private void testDailyRollingFileAppender(final String configResource, final String name, final String filePattern) throws URISyntaxException {
final Configuration configuration = getConfiguration(configResource);
final Appender appender = configuration.getAppender(name);
assertNotNull(appender);
assertEquals(name, appender.getName());
assertTrue(appender.getClass().getName(), appender instanceof RollingFileAppender);
final RollingFileAppender rfa = (RollingFileAppender) appender;
assertEquals("target/hadoop.log", rfa.getFileName());
assertEquals(filePattern, rfa.getFilePattern());
final TriggeringPolicy triggeringPolicy = rfa.getTriggeringPolicy();
assertNotNull(triggeringPolicy);
assertTrue(triggeringPolicy.getClass().getName(), triggeringPolicy instanceof CompositeTriggeringPolicy);
final CompositeTriggeringPolicy ctp = (CompositeTriggeringPolicy) triggeringPolicy;
final TriggeringPolicy[] triggeringPolicies = ctp.getTriggeringPolicies();
assertEquals(1, triggeringPolicies.length);
final TriggeringPolicy tp = triggeringPolicies[0];
assertTrue(tp.getClass().getName(), tp instanceof TimeBasedTriggeringPolicy);
final TimeBasedTriggeringPolicy tbtp = (TimeBasedTriggeringPolicy) tp;
assertEquals(1, tbtp.getInterval());
final RolloverStrategy rolloverStrategy = rfa.getManager().getRolloverStrategy();
assertTrue(rolloverStrategy.getClass().getName(), rolloverStrategy instanceof DefaultRolloverStrategy);
final DefaultRolloverStrategy drs = (DefaultRolloverStrategy) rolloverStrategy;
assertEquals(Integer.MAX_VALUE, drs.getMaxIndex());
configuration.start();
configuration.stop();
}
@Test
public void testFromClassPathProperty() throws Exception {
System.setProperty(ConfigurationFactory.CONFIGURATION_FILE_PROPERTY, "classpath:log4j2-config.xml");
ctx = Configurator.initialize("Test1", null);
LogManager.getLogger("org.apache.test.TestConfigurator");
Configuration config = ctx.getConfiguration();
assertNotNull("No configuration", config);
assertEquals("Incorrect Configuration.", CONFIG_NAME, config.getName());
final Map<String, Appender> map = config.getAppenders();
assertNotNull("Appenders map should not be null.", map);
assertThat(map, hasSize(greaterThan(0)));
assertThat("Wrong configuration", map, hasKey("List"));
Configurator.shutdown(ctx);
config = ctx.getConfiguration();
assertEquals("Unexpected Configuration.", NullConfiguration.NULL_NAME, config.getName());
}
/**
* Configures the Log4j2 console appender(s), using the specified verbosity:
* <ul>
* <li>{@code -vvv} : enable TRACE level</li>
* <li>{@code -vv} : enable DEBUG level</li>
* <li>{@code -v} : enable INFO level</li>
* <li>(not specified) : enable WARN level</li>
* </ul>
*/
public void configureLoggers() {
Level level = getTopLevelCommandLoggingMixin(mixee).calcLogLevel();
LoggerContext loggerContext = LoggerContext.getContext(false);
LoggerConfig rootConfig = loggerContext.getConfiguration().getRootLogger();
for (Appender appender : rootConfig.getAppenders().values()) {
if (appender instanceof ConsoleAppender) {
rootConfig.removeAppender(appender.getName());
rootConfig.addAppender(appender, level, null);
}
}
if (rootConfig.getLevel().isMoreSpecificThan(level)) {
rootConfig.setLevel(level);
}
loggerContext.updateLoggers(); // apply the changes
}
public void watch(Class<?> loggerClass, Level level) {
this.loggerClass = loggerClass;
Appender appender = new AbstractAppender(APPENDER_NAME, null, PatternLayout.createDefaultLayout()) {
@Override
public void append(LogEvent event) {
logEvents.add(new RecordedLogEvent(event));
}
};
appender.start();
final LoggerContext ctx = getLoggerContext();
LoggerConfig loggerConfig = ctx.getConfiguration().getLoggerConfig(loggerClass.getName());
oldLevel = loggerConfig.getLevel();
loggerConfig.setLevel(level);
loggerConfig.addAppender(appender, level, null);
ctx.updateLoggers();
}
@Test
public void testListAppender() throws Exception {
LoggerContext loggerContext = configure("target/test-classes/log4j1-list.xml");
Logger logger = LogManager.getLogger("test");
logger.debug("This is a test of the root logger");
Configuration configuration = loggerContext.getConfiguration();
Map<String, Appender> appenders = configuration.getAppenders();
ListAppender eventAppender = null;
ListAppender messageAppender = null;
for (Map.Entry<String, Appender> entry : appenders.entrySet()) {
if (entry.getKey().equals("list")) {
messageAppender = (ListAppender) ((AppenderAdapter.Adapter) entry.getValue()).getAppender();
} else if (entry.getKey().equals("events")) {
eventAppender = (ListAppender) ((AppenderAdapter.Adapter) entry.getValue()).getAppender();
}
}
assertNotNull("No Event Appender", eventAppender);
assertNotNull("No Message Appender", messageAppender);
List<LoggingEvent> events = eventAppender.getEvents();
assertTrue("No events", events != null && events.size() > 0);
List<String> messages = messageAppender.getMessages();
assertTrue("No messages", messages != null && messages.size() > 0);
}
@Test
public void deliverItemSourceDelegates() {
// given
Appender appender = mock(Appender.class);
when(appender.isStarted()).thenReturn(true);
Configuration configuration = mock(Configuration.class);
String testAppenderRef = "testAppenderRef";
when(configuration.getAppender(testAppenderRef)).thenReturn(appender);
FailoverPolicy<String> failoverPolicy = spy(createTestFailoverPolicy(testAppenderRef, configuration));
String failedMessage = UUID.randomUUID().toString();
ItemSource<String> itemSource = new StringItemSource(failedMessage);
// when
failoverPolicy.deliver(itemSource);
// then
verify(failoverPolicy).deliver(eq(failedMessage));
}
@Test
public void testAppendWithKeyLookup() throws Exception {
final Appender appender = ctx.getRequiredAppender("KafkaAppenderWithKeyLookup");
final LogEvent logEvent = createLogEvent();
Date date = new Date();
SimpleDateFormat format = new SimpleDateFormat("dd-MM-yyyy");
appender.append(logEvent);
final List<ProducerRecord<byte[], byte[]>> history = kafka.history();
assertEquals(1, history.size());
final ProducerRecord<byte[], byte[]> item = history.get(0);
assertNotNull(item);
assertEquals(TOPIC_NAME, item.topic());
byte[] keyValue = format.format(date).getBytes(StandardCharsets.UTF_8);
assertEquals(Long.valueOf(logEvent.getTimeMillis()), item.timestamp());
assertArrayEquals(item.key(), keyValue);
assertEquals(LOG_MESSAGE, new String(item.value(), StandardCharsets.UTF_8));
}
/**
* Disables all log4j2 ConsoleAppender's by modifying log4j configuration dynamically.
* Must only be used during early startup
* @return true if ok or else false if something happened, e.g. log4j2 classes were not in classpath
*/
@SuppressForbidden(reason = "Legitimate log4j2 access")
public static boolean muteConsole() {
try {
if (!isLog4jActive()) {
logNotSupported("Could not mute logging to console.");
return false;
}
LoggerContext ctx = (LoggerContext) LogManager.getContext(false);
Configuration config = ctx.getConfiguration();
LoggerConfig loggerConfig = config.getLoggerConfig(LogManager.ROOT_LOGGER_NAME);
Map<String, Appender> appenders = loggerConfig.getAppenders();
appenders.forEach((name, appender) -> {
if (appender instanceof ConsoleAppender) {
loggerConfig.removeAppender(name);
ctx.updateLoggers();
}
});
return true;
} catch (Exception e) {
logNotSupported("Could not mute logging to console.");
return false;
}
}
@Test
public void testAppend() throws Exception {
wireMockRule.stubFor(post(urlEqualTo("/test/log4j/"))
.willReturn(SUCCESS_RESPONSE));
final Appender appender = HttpAppender.newBuilder()
.setName("Http")
.setLayout(JsonLayout.createDefaultLayout())
.setConfiguration(ctx.getConfiguration())
.setUrl(new URL("http://localhost:" + wireMockRule.port() + "/test/log4j/"))
.build();
appender.append(createLogEvent());
wireMockRule.verify(postRequestedFor(urlEqualTo("/test/log4j/"))
.withHeader("Host", containing("localhost"))
.withHeader("Content-Type", containing("application/json"))
.withRequestBody(containing("\"message\" : \"" + LOG_MESSAGE + "\"")));
}
@Test
public void testRewrite() throws Exception {
Logger logger = LogManager.getLogger("test");
ThreadContext.put("key1", "This is a test");
ThreadContext.put("hello", "world");
logger.debug("Say hello");
LoggerContext context = (LoggerContext) org.apache.logging.log4j.LogManager.getContext(false);
Configuration configuration = context.getConfiguration();
Map<String, Appender> appenders = configuration.getAppenders();
ListAppender eventAppender = null;
for (Map.Entry<String, Appender> entry : appenders.entrySet()) {
if (entry.getKey().equals("events")) {
eventAppender = (ListAppender) ((AppenderAdapter.Adapter) entry.getValue()).getAppender();
}
}
assertNotNull("No Event Appender", eventAppender);
List<LoggingEvent> events = eventAppender.getEvents();
assertTrue("No events", events != null && events.size() > 0);
assertNotNull("No properties in the event", events.get(0).getProperties());
assertTrue("Key was not inserted", events.get(0).getProperties().containsKey("key2"));
assertEquals("Key value is incorrect", "Log4j", events.get(0).getProperties().get("key2"));
}
@Test
public void testAppendWithKeyLookup() {
final Appender appender = ctx.getConfiguration().getAppender("PulsarAppenderWithKeyLookup");
final LogEvent logEvent = createLogEvent();
Date date = new Date();
SimpleDateFormat format = new SimpleDateFormat("dd-MM-yyyy");
appender.append(logEvent);
Message<byte[]> item;
synchronized (history) {
assertEquals(1, history.size());
item = history.get(0);
}
assertNotNull(item);
String keyValue = format.format(date);
assertEquals(item.getKey(), keyValue);
assertEquals(LOG_MESSAGE, new String(item.getData(), StandardCharsets.UTF_8));
}
@Override
public StringWriter addLoggingWriterAppender(String appenderName)
{
// Get the configuration
final LoggerContext loggerContext = (LoggerContext) LogManager.getContext(false);
final Configuration configuration = loggerContext.getConfiguration();
// Create a string writer as part of the appender so logging will be written to it.
StringWriter stringWriter = new StringWriter();
// Create and start the appender with the string writer.
Appender appender = WriterAppender.createAppender(null, null, stringWriter, appenderName, false, true);
appender.start();
// Add the appender to the root logger.
configuration.getRootLogger().addAppender(appender, null, null);
// Return the string writer.
return stringWriter;
}
private static Logger configureLog4j() {
LoggerContext context = (LoggerContext) LogManager.getContext();
Configuration config = context.getConfiguration();
PatternLayout layout = PatternLayout.createLayout("%m%n", null, null, Charset.defaultCharset(), false, false, null, null);
Appender appender = ConsoleAppender.createAppender(layout, null, null, "CONSOLE_APPENDER", null, null);
appender.start();
AppenderRef ref = AppenderRef.createAppenderRef("CONSOLE_APPENDER", null, null);
AppenderRef[] refs = new AppenderRef[]{ref};
LoggerConfig loggerConfig = LoggerConfig.createLogger("false", Level.INFO, "CONSOLE_LOGGER", "com", refs, null, null, null);
loggerConfig.addAppender(appender, null, null);
config.addAppender(appender);
config.addLogger("Main.class", loggerConfig);
context.updateLoggers(config);
return LogManager.getContext().getLogger("Main.class");
}
/**
* Associates an Appender with a LoggerConfig. This method is synchronized in case a Logger with the same name is
* being updated at the same time.
*
* Note: This method is not used when configuring via configuration. It is primarily used by unit tests.
*
* @param logger The Logger the Appender will be associated with.
* @param appender The Appender.
*/
@Override
public synchronized void addLoggerAppender(final org.apache.logging.log4j.core.Logger logger,
final Appender appender) {
if (appender == null || logger == null) {
return;
}
final String loggerName = logger.getName();
appenders.putIfAbsent(appender.getName(), appender);
final LoggerConfig lc = getLoggerConfig(loggerName);
if (lc.getName().equals(loggerName)) {
lc.addAppender(appender, null, null);
} else {
final LoggerConfig nlc = new LoggerConfig(loggerName, lc.getLevel(), lc.isAdditive());
nlc.addAppender(appender, null, null);
nlc.setParent(lc);
loggerConfigs.putIfAbsent(loggerName, nlc);
setParents();
logger.getContext().updateLoggers();
}
}
@Test
public void testAppendHttps() throws Exception {
wireMockRule.stubFor(post(urlEqualTo("/test/log4j/"))
.willReturn(SUCCESS_RESPONSE));
final Appender appender = HttpAppender.newBuilder()
.setName("Http")
.setLayout(JsonLayout.createDefaultLayout())
.setConfiguration(ctx.getConfiguration())
.setUrl(new URL("https://localhost:" + wireMockRule.httpsPort() + "/test/log4j/"))
.setSslConfiguration(SslConfiguration.createSSLConfiguration(null,
KeyStoreConfiguration.createKeyStoreConfiguration(TestConstants.KEYSTORE_FILE, TestConstants.KEYSTORE_PWD(), null, null, TestConstants.KEYSTORE_TYPE, null),
TrustStoreConfiguration.createKeyStoreConfiguration(TestConstants.TRUSTSTORE_FILE, TestConstants.TRUSTSTORE_PWD(), null ,null, TestConstants.TRUSTSTORE_TYPE, null)))
.setVerifyHostname(false)
.build();
appender.append(createLogEvent());
wireMockRule.verify(postRequestedFor(urlEqualTo("/test/log4j/"))
.withHeader("Host", containing("localhost"))
.withHeader("Content-Type", containing("application/json"))
.withRequestBody(containing("\"message\" : \"" + LOG_MESSAGE + "\"")));
}
@Test
public void testPropertiesConfiguration() {
final Configuration config = context.getConfiguration();
assertNotNull("No configuration created", config);
assertEquals("Incorrect State: " + config.getState(), config.getState(), LifeCycle.State.STARTED);
final Map<String, Appender> appenders = config.getAppenders();
assertNotNull(appenders);
assertTrue("Incorrect number of Appenders: " + appenders.size(), appenders.size() == 1);
final Map<String, LoggerConfig> loggers = config.getLoggers();
assertNotNull(loggers);
assertTrue("Incorrect number of LoggerConfigs: " + loggers.size(), loggers.size() == 2);
final Filter filter = config.getFilter();
assertNotNull("No Filter", filter);
assertTrue("Not a Threshold Filter", filter instanceof ThresholdFilter);
final Logger logger = LogManager.getLogger(getClass());
assertEquals("Incorrect level " + logger.getLevel(), Level.DEBUG, logger.getLevel());
logger.debug("Welcome to Log4j!");
}
public static void addAppender(final Logger logger, final Appender appender) {
// final LoggerContext ctx = (LoggerContext) LogManager.getContext(false);
// final Configuration config = ctx.getConfiguration();
// config.addAppender(appender);
// LoggerConfig loggerConfig = config.getLoggerConfig(logger.getName());
// if (!logger.getName().equals(loggerConfig.getName())) {
// loggerConfig = new LoggerConfig(logger.getName(), logger.getLevel(), true);
// config.addLogger(logger.getName(), loggerConfig);
// }
// loggerConfig.addAppender(appender, null, null);
// ctx.updateLoggers();
}
/**
* Creates a Map of the Appenders.
* @param appenders An array of Appenders.
* @return The Appender Map.
*/
@PluginFactory
public static ConcurrentMap<String, Appender> createAppenders(
@PluginElement("Appenders") final Appender[] appenders) {
final ConcurrentMap<String, Appender> map = new ConcurrentHashMap<>(appenders.length);
for (final Appender appender : appenders) {
map.put(appender.getName(), appender);
}
return map;
}
public static Appender findAppender(final Logger logger, final Class<? extends Appender> clazz) {
// final LoggerContext ctx = (LoggerContext) LogManager.getContext(false);
// final Configuration config = ctx.getConfiguration();
// final LoggerConfig loggerConfig = config.getLoggerConfig(logger.getName());
// for (final Map.Entry<String, Appender> entry : loggerConfig.getAppenders().entrySet()) {
// if (entry.getValue().getClass().equals(clazz)) {
// return entry.getValue();
// }
// }
return null;
}
public void start(LogConfig abyLogConfig) {
//为false时,返回多个LoggerContext对象, true:返回唯一的单例LoggerContext
final LoggerContext ctx = (LoggerContext) LogManager.getContext(false);
final Configuration config = ctx.getConfiguration();
org.apache.logging.log4j.core.Logger cfgLogger = (org.apache.logging.log4j.core.Logger) LogManager.getLogger(abyLogConfig.getCfgLogName());
if (cfgLogger == null) {
LogManager.getLogger(LogFactory.class).error("not found {} logger (please define in log4j2.xml)", abyLogConfig.getCfgLogName());
return;
}
List<AppenderRef> appenderRefs = new ArrayList<>();
Map<String, Appender> appenderMap = cfgLogger.getAppenders();
List<Appender> appenders = new ArrayList<>();
appenderMap.forEach((key, appenderCfg) -> {
Appender appender;
if (appenderCfg instanceof ConsoleAppender) {
appender = appenderCfg;
} else {
appender = getAppender(abyLogConfig, config, appenderCfg);
}
if (appender != null) {
AppenderRef ref = AppenderRef.createAppenderRef(appender.getName(), Level.ALL, null);
appenderRefs.add(ref);
appenders.add(appender);
}
});
if (CollectionUtils.isEmpty(appenders)) {
return;
}
AppenderRef[] refs = new AppenderRef[appenderRefs.size()];
refs = appenderRefs.toArray(refs);
LoggerConfig loggerConfig = LoggerConfig.createLogger(false, cfgLogger.getLevel(), abyLogConfig.getName(),
"true", refs, null, config, null);
appenders.stream().forEach(e ->
loggerConfig.addAppender(e, Level.ALL, null)
);
config.addLogger(abyLogConfig.getName(), loggerConfig);
ctx.updateLoggers(config);
}
private Appender getAppender(LogConfig abyLogConfig, Configuration config, Appender appenderCfg) {
Appender appender = null;
if (appenderCfg instanceof RollingFileAppender) {
RollingFileAppender rollingFileAppender = (RollingFileAppender) appenderCfg;
appender = RollingFileAppender.newBuilder()
.setConfiguration(config)
.withName(appenderCfg.getName().replace(abyLogConfig.getAppenderNameKey(), abyLogConfig.getName()))
.withFileName(rollingFileAppender.getFileName().replaceAll(abyLogConfig.getFileNameKey(), abyLogConfig.getFileName()))
.withFilePattern(rollingFileAppender.getFilePattern().replaceAll(abyLogConfig.getFileNameKey(), abyLogConfig.getFileName()))
.withLayout(rollingFileAppender.getLayout())
.withFilter(rollingFileAppender.getFilter())
.withPolicy(rollingFileAppender.getTriggeringPolicy())
.withStrategy(rollingFileAppender.getManager().getRolloverStrategy())
.build();
} else if (appenderCfg instanceof FileAppender) {
FileAppender fileAppender = (FileAppender) appenderCfg;
appender = FileAppender.newBuilder()
.setConfiguration(config)
.withName(appenderCfg.getName().replace(abyLogConfig.getAppenderNameKey(), abyLogConfig.getName()))
.withFileName(fileAppender.getFileName().replaceAll(abyLogConfig.getFileNameKey(), abyLogConfig.getFileName()))
.withLayout(fileAppender.getLayout())
.withFilter(fileAppender.getFilter())
.build();
} else {
LogManager.getLogger(LogFactory.class).warn("unsupported appender type ,appender type not in(RollingFileAppender,ConsoleAppender,FileAppender)", appenderCfg.getClass());
}
if (appender != null) {
if (!appender.isStarted()) {
appender.start();
}
config.addAppender(appender);
}
return appender;
}
@SuppressWarnings("deprecation")
@Override
public void init() {
try {
LoggerContext loggerContext = (LoggerContext)LogManager.getContext(false);
if (loggerContext == null)
return;
org.apache.logging.log4j.core.Logger logger =
loggerContext.getLogger("org.apache.kafka.clients.producer.ProducerConfig");
if (logger != null) {
logger.setLevel(org.apache.logging.log4j.Level.ERROR);
}
createBizLogger();
Configuration configuration = loggerContext.getConfiguration();
configuration.getPluginPackages().add("org.apache.skywalking.apm.toolkit.log.log4j.v2.x");
Map<String, Appender> appenders = configuration.getAppenders();
for (Appender appender : appenders.values()) {
Layout<? extends Serializable> layout = appender.getLayout();
if (layout instanceof PatternLayout) {
PatternLayout patternLayOut = (PatternLayout)layout;
Serializer serializer = PatternLayout.createSerializer(configuration, null, getLog4jPattern(),
getLog4jPattern(), null, true, true);
Field field = patternLayOut.getClass().getDeclaredField("eventSerializer");
Field modifiersField = Field.class.getDeclaredField("modifiers");
modifiersField.setAccessible(true);
modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL);
if (!field.isAccessible()) {
field.setAccessible(true);
}
field.set(patternLayOut, serializer);
}
}
loggerContext.updateLoggers();
} catch (Throwable e) {
logger.warn(e.getMessage());
}
}
@Test
public void testInitialize_Name_LocationName() throws Exception {
ctx = Configurator.initialize("Test1", "log4j2-config.xml");
LogManager.getLogger("org.apache.test.TestConfigurator");
Configuration config = ctx.getConfiguration();
assertNotNull("No configuration", config);
assertEquals("Incorrect Configuration.", CONFIG_NAME, config.getName());
final Map<String, Appender> map = config.getAppenders();
assertNotNull("Appenders map should not be null.", map);
assertThat(map, hasSize(greaterThan(0)));
assertThat("Wrong configuration", map, hasKey("List"));
Configurator.shutdown(ctx);
config = ctx.getConfiguration();
assertEquals("Unexpected Configuration.", NullConfiguration.NULL_NAME, config.getName());
}
@Before
public void before() {
appender = Mockito.mock(Appender.class);
when(appender.getName()).thenReturn("TestAppender");
when(appender.isStarted()).thenReturn(true);
getLoggerConfig().addAppender(appender, Level.ALL, null);
}
@Test
void testLogFileJson(@TempDir Path tempDir) {
String logFile = tempDir.resolve("agent.json").toString();
Configuration configuration = getLogConfig(Map.of("log_file", logFile, "log_format_file", "json"));
assertThat(configuration.getAppenders().values()).hasSize(1);
Appender appender = configuration.getAppenders().values().iterator().next();
assertThat(appender).isInstanceOf(RollingFileAppender.class);
assertThat(((RollingFileAppender) appender).getFileName()).isEqualTo(logFile);
assertThat(appender.getLayout()).isInstanceOf(EcsLayout.class);
}
public static Appender findAppender(final Logger logger, final Class<? extends Appender> clazz) {
final LoggerContext ctx = (LoggerContext) LogManager.getContext(false);
final Configuration config = ctx.getConfiguration();
final LoggerConfig loggerConfig = config.getLoggerConfig(logger.getName());
for (final Map.Entry<String, Appender> entry : loggerConfig.getAppenders().entrySet()) {
if (entry.getValue().getClass().equals(clazz)) {
return entry.getValue();
}
}
return null;
}
@Test
public void testAppenderNoEventTimestamp() throws Exception {
final Appender appender = ctx.getRequiredAppender("KafkaAppenderNoEventTimestamp");
final LogEvent logEvent = createLogEvent();
appender.append(logEvent);
final List<ProducerRecord<byte[], byte[]>> history = kafka.history();
assertEquals(1, history.size());
final ProducerRecord<byte[], byte[]> item = history.get(0);
assertNotNull(item);
assertEquals(TOPIC_NAME, item.topic());
byte[] keyValue = "key".getBytes(StandardCharsets.UTF_8);
assertArrayEquals(item.key(), keyValue);
assertNotEquals(Long.valueOf(logEvent.getTimeMillis()), item.timestamp());
assertEquals(LOG_MESSAGE, new String(item.value(), StandardCharsets.UTF_8));
}
@Test
void testSoutJson() {
Configuration configuration = getLogConfig(Map.of("ship_agent_logs", "false", "log_format_sout", "JSON"));
assertThat(configuration.getAppenders().values()).hasSize(1);
Appender appender = configuration.getAppenders().values().iterator().next();
assertThat(appender).isInstanceOf(ConsoleAppender.class);
assertThat(appender.getLayout()).isInstanceOf(EcsLayout.class);
}
@Test
public void testReconfiguration() throws Exception {
final File file = new File("target/test-classes/log4j2-config.xml");
assertTrue("setLastModified should have succeeded.", file.setLastModified(System.currentTimeMillis() - 120000));
ctx = Configurator.initialize("Test1", "target/test-classes/log4j2-config.xml");
final Logger logger = LogManager.getLogger("org.apache.test.TestConfigurator");
Configuration config = ctx.getConfiguration();
assertNotNull("No configuration", config);
assertEquals("Incorrect Configuration.", CONFIG_NAME, config.getName());
final Map<String, Appender> map = config.getAppenders();
assertNotNull("Appenders map should not be null.", map);
assertThat(map, hasSize(greaterThan(0)));
assertThat("Wrong configuration", map, hasKey("List"));
// Sleep and check
Thread.sleep(50);
if (!file.setLastModified(System.currentTimeMillis())) {
Thread.sleep(500);
}
assertTrue("setLastModified should have succeeded.", file.setLastModified(System.currentTimeMillis()));
TimeUnit.SECONDS.sleep(config.getWatchManager().getIntervalSeconds()+1);
for (int i = 0; i < 17; ++i) {
logger.debug("Test message " + i);
}
// Sleep and check
Thread.sleep(50);
if (is(theInstance(config)).matches(ctx.getConfiguration())) {
Thread.sleep(500);
}
final Configuration newConfig = ctx.getConfiguration();
assertThat("Configuration not reset", newConfig, is(not(theInstance(config))));
Configurator.shutdown(ctx);
config = ctx.getConfiguration();
assertEquals("Unexpected Configuration.", NullConfiguration.NULL_NAME, config.getName());
}