/** * Writes status messages to the console. * @param data The StatusData. */ @Override public void log(final StatusData data) { if (!filtered(data)) { stream.println(data.getFormattedStatus()); } }
@Test public void narrow() throws Exception { final Logger logger = LogManager.getLogger(OutputStreamManagerTest.class); logger.info("test"); final List<StatusData> statusData = StatusLogger.getLogger().getStatusData(); StatusData data = statusData.get(0); if (data.getMessage().getFormattedMessage().contains("WindowsAnsiOutputStream")) { data = statusData.get(1); } assertEquals(Level.ERROR, data.getLevel()); assertEquals("Could not create plugin of type class org.apache.logging.log4j.core.appender.RollingRandomAccessFileAppender for element RollingRandomAccessFile", data.getMessage().getFormattedMessage()); assertEquals("org.apache.logging.log4j.core.config.ConfigurationException: Configuration has multiple incompatible Appenders pointing to the same resource 'target/multiIncompatibleAppender.log'", data.getThrowable().toString()); }
element = getStackTraceElement(fqcn, Thread.currentThread().getStackTrace()); final StatusData data = new StatusData(element, level, msg, t, null); msgLock.lock(); try { if (listeners.size() > 0) { for (final StatusListener listener : listeners) { if (data.getLevel().isMoreSpecificThan(listener.getStatusLevel())) { listener.log(data);
@Test public void testEmptyAttribute() throws Exception { final Logger logger = LogManager.getLogger(); logger.info("Test"); final StatusData data = StatusLogger.getLogger().getStatusData().get(0); //System.out.println(data.getFormattedStatus()); assertEquals(Level.ERROR, data.getLevel()); assertTrue(data.getMessage().getFormattedMessage().contains("multiple root loggers")); } }
@Test public void testMessageThrowsAndNullFormat() { final ThrowableExpectingLogger logger = new ThrowableExpectingLogger(false); logger.error(new TestMessage(new TestMessage.FormattedMessageSupplier() { @Override public String getFormattedMessage() { throw new IllegalStateException("Oops!"); } }, null /* format */)); List<StatusData> statusDatalist = StatusLogger.getLogger().getStatusData(); StatusData mostRecent = statusDatalist.get(statusDatalist.size() - 1); assertEquals(Level.WARN, mostRecent.getLevel()); assertThat(mostRecent.getFormattedStatus(), containsString( "org.apache.logging.log4j.spi.AbstractLogger caught " + "java.lang.IllegalStateException logging TestMessage: ")); }
public class HaltingStatusListener implements StatusListener { public Level getStatusLevel() { return Level.ERROR; } public void log(StatusData data) { throw new BigDealException("Internal log4j error detected: " + data.getMessage()); } }
private boolean filtered(final StatusData data) { if (filters == null) { return false; } final String caller = data.getStackTraceElement().getClassName(); for (final String filter : filters) { if (caller.startsWith(filter)) { return true; } } return false; }
sb.append(format.format(new Date(timestamp))); sb.append(SPACE); sb.append(getThreadName()); sb.append(SPACE); sb.append(level.toString());
@Override public void log(StatusData data) { Throwable throwable = data.getThrowable(); if (throwable instanceof SAXException || throwable instanceof IOException || throwable instanceof ParserConfigurationException) { SystemUtil.exit(SystemUtil.Code.FAILED_TO_LOAD_CONFIG); } }
@Test public void testMessageThrows() { final ThrowableExpectingLogger logger = new ThrowableExpectingLogger(false); logger.error(new TestMessage(new TestMessage.FormattedMessageSupplier() { @Override public String getFormattedMessage() { throw new IllegalStateException("Oops!"); } }, "Message Format")); List<StatusData> statusDatalist = StatusLogger.getLogger().getStatusData(); StatusData mostRecent = statusDatalist.get(statusDatalist.size() - 1); assertEquals(Level.WARN, mostRecent.getLevel()); assertThat(mostRecent.getFormattedStatus(), containsString( "org.apache.logging.log4j.spi.AbstractLogger caught " + "java.lang.IllegalStateException logging TestMessage: Message Format")); }
assertEquals(Level.ERROR, error.getLevel()); assertEquals("Unable to send HTTP in appender [Http]", error.getMessage().toString());
protected static void checkStaticState(boolean afterClass) throws Exception { if (afterClass) { MockPageCacheRecycler.ensureAllPagesAreReleased(); } MockBigArrays.ensureAllArraysAreReleased(); // ensure no one changed the status logger level on us assertThat(StatusLogger.getLogger().getLevel(), equalTo(Level.WARN)); synchronized (statusData) { try { // ensure that there are no status logger messages which would indicate a problem with our Log4j usage; we map the // StatusData instances to Strings as otherwise their toString output is useless assertThat( statusData.stream().map(status -> status.getMessage().getFormattedMessage()).collect(Collectors.toList()), empty()); } finally { // we clear the list so that status data from other tests do not interfere with tests within the same JVM statusData.clear(); } } }
private boolean filtered(final StatusData data) { if (filters == null) { return false; } final String caller = data.getStackTraceElement().getClassName(); for (final String filter : filters) { if (caller.startsWith(filter)) { return true; } } return false; }
sb.append(format.format(new Date(timestamp))); sb.append(SPACE); sb.append(getThreadName()); sb.append(SPACE); sb.append(level.toString());
"Logging in toString() #128", actual.pop()); StatusData mostRecentStatusData = statusDataList.get(statusDataList.size() - 1); assertEquals("Expected warn level status message", Level.WARN, mostRecentStatusData.getLevel()); assertThat(mostRecentStatusData.getFormattedStatus(), containsString( "Log4j2 logged an event out of order to prevent deadlock caused by domain " + "objects logging from their toString method when the async queue is full"));
import org.apache.logging.log4j.status.StatusData; import org.apache.logging.log4j.status.StatusLogger; ... StatusLogger statusLogger = StatusLogger.getLogger(); if (statusLogger.getStatusData().size() > 0) { System.out.printf( "Logged %d messages\n", statusLogger.getStatusData().size() ); // Investigate List<StatusData> if you want for(StatusData data : statusLogger.getStatusData()) { System.out.printf( " Level %s message: %s\n", data.getLevel(), data.getMessage().getFormattedMessage() ); } System.err.println("exiting due to unexpected console status logs"); System.exit(1); }
/** * Writes status messages to the console. * @param data The StatusData. */ @Override public void log(final StatusData data) { if (!filtered(data)) { stream.println(data.getFormattedStatus()); } }
element = getStackTraceElement(fqcn, Thread.currentThread().getStackTrace()); final StatusData data = new StatusData(element, level, msg, t, null); msgLock.lock(); try { if (listeners.size() > 0) { for (final StatusListener listener : listeners) { if (data.getLevel().isMoreSpecificThan(listener.getStatusLevel())) { listener.log(data);
@Override public String[] getStatusDataHistory() { final List<StatusData> data = getStatusData(); final String[] result = new String[data.size()]; for (int i = 0; i < result.length; i++) { result[i] = data.get(i).getFormattedStatus(); } return result; }
@Override public void log(final StatusData data) { final Notification notifMsg = new Notification(NOTIF_TYPE_MESSAGE, getObjectName(), nextSeqNo(), nowMillis(), data.getFormattedStatus()); sendNotification(notifMsg); final Notification notifData = new Notification(NOTIF_TYPE_DATA, getObjectName(), nextSeqNo(), nowMillis()); notifData.setUserData(data); sendNotification(notifData); }