@Override public void addStatusEvent(final Status status) { final Level level; switch (status.getLevel()) { case Status.INFO: level = Level.INFO; break; case Status.WARN: level = Level.WARN; break; case Status.ERROR: level = Level.ERROR; break; default: level = Level.INFO; break; } final LoggingEvent event = new LoggingEvent(StatusToFileListener.class.getSimpleName(), new LoggerContext().getLogger(StatusToFileListener.class), level, status.getMessage(), null, null); append(event); }
static void checkSanity(Auditor auditor) throws AuditException { StatusManager sm = auditor.getStatusManager(); if (getHighestLevel(0, sm) > Status.INFO) { StatusPrinter.print(sm); } if (auditor.getClientApplication() == null) { throw new AuditException("Client application has not been set"); } if (auditor.getAuditAppender() == null) { throw new AuditException("No audit appender. Please see " + NULL_AUDIT_APPENDER_URL); } }
/** * Add a new status object. * * @param newStatus * the status message to add */ public void add(Status newStatus) { // LBCORE-72: fire event before the count check fireStatusAddEvent(newStatus); count++; if (newStatus.getLevel() > level) { level = newStatus.getLevel(); } synchronized (statusListLock) { if (statusList.size() < MAX_HEADER_COUNT) { statusList.add(newStatus); } else { tailBuffer.add(newStatus); } } }
@Test public void testPrudentModeLogicalImplicationsOnCompression() { rfa.setContext(context); rfa.setAppend(false); rfa.setPrudent(true); tbrp.setFileNamePattern(CoreTestConstants.OUTPUT_DIR_PREFIX + "toto-%d.log.zip"); tbrp.start(); rfa.setRollingPolicy(tbrp); rfa.start(); StatusChecker checker = new StatusChecker(context); assertFalse(rfa.isStarted()); assertEquals(Status.ERROR, checker.getHighestLevel(0)); }
@Test public void inexistentFile() { TrivialStatusListener tsl = new TrivialStatusListener(); tsl.start(); String filename = CoreTestConstants.TEST_SRC_PREFIX + "input/joran/" + "nothereBLAH.xml"; context.getStatusManager().add(tsl); try { doTest(filename); } catch (Exception e) { assertTrue(e.getMessage().startsWith("Could not open [")); } assertTrue(tsl.list.size() + " should be greater than or equal to 1", tsl.list.size() >= 1); Status s0 = tsl.list.get(0); assertTrue(s0.getMessage().startsWith("Could not open [")); }
@Test public void many() { int margin = 300; int len = MAX_HEADER_COUNT + TAIL_SIZE + margin; for (int i = 0; i < len; i++) { bsm.add(new ErrorStatus("" + i, this)); } List<Status> statusList = bsm.getCopyOfStatusList(); assertNotNull(statusList); assertEquals(MAX_HEADER_COUNT + TAIL_SIZE, statusList.size()); List<Status> witness = new ArrayList<Status>(); for (int i = 0; i < MAX_HEADER_COUNT; i++) { witness.add(new ErrorStatus("" + i, this)); } for (int i = 0; i < TAIL_SIZE; i++) { witness.add(new ErrorStatus("" + (MAX_HEADER_COUNT + margin + i), this)); } assertEquals(witness, statusList); }
@Test public void wrongTarget() { ConsoleAppender<Object> ca = (ConsoleAppender<Object>) getAppender(); EchoEncoder<Object> encoder = new EchoEncoder<Object>(); encoder.setContext(context); ca.setContext(context); ca.setTarget("foo"); ca.setEncoder(encoder); ca.start(); ca.doAppend("a"); StatusChecker checker = new StatusChecker(context); //21:28:01,246 + WARN in ch.qos.logback.core.ConsoleAppender[null] - [foo] should be one of [SystemOut, SystemErr] //21:28:01,246 |-WARN in ch.qos.logback.core.ConsoleAppender[null] - Using previously set target, System.out by default. // StatusPrinter.print(context); checker.assertContainsMatch(Status.WARN, "\\[foo\\] should be one of \\[SystemOut, SystemErr\\]"); }
@Test(timeout = 4000L) public void fallbackToSafe() throws IOException, JoranException, InterruptedException { String path = CoreTestConstants.OUTPUT_DIR_PREFIX + "reconfigureOnChangeConfig_fallbackToSafe-" + diff + ".xml"; File topLevelFile = new File(path); writeToFile(topLevelFile, "<configuration scan=\"true\" scanPeriod=\"50 millisecond\"><root level=\"ERROR\"/></configuration> "); configure(topLevelFile); writeToFile(topLevelFile, "<configuration scan=\"true\" scanPeriod=\"50 millisecond\">\n" + " <root></configuration>"); rocfDetachReconfigurationToNewThreadAndAwaitTermination(); checker.assertContainsMatch(Status.WARN, "Falling back to previously registered safe configuration."); checker.assertContainsMatch(Status.INFO, "Re-registering previous fallback configuration once more"); assertThatFirstFilterIsROCF(); }
@Test(timeout = 4000L) public void fallbackToSafeWithIncludedFile() throws IOException, JoranException, InterruptedException { String topLevelFileAsStr = CoreTestConstants.OUTPUT_DIR_PREFIX + "reconfigureOnChangeConfig_top-" + diff + ".xml"; String innerFileAsStr = CoreTestConstants.OUTPUT_DIR_PREFIX + "reconfigureOnChangeConfig_inner-" + diff + ".xml"; File topLevelFile = new File(topLevelFileAsStr); writeToFile(topLevelFile, "<configuration scan=\"true\" scanPeriod=\"50 millisecond\"><include file=\"" + innerFileAsStr + "\"/></configuration> "); File innerFile = new File(innerFileAsStr); writeToFile(innerFile, "<included><root level=\"ERROR\"/></included> "); configure(topLevelFile); writeToFile(innerFile, "<included>\n<root>\n</included>"); rocfDetachReconfigurationToNewThreadAndAwaitTermination(); checker.assertContainsMatch(Status.WARN, "Falling back to previously registered safe configuration."); checker.assertContainsMatch(Status.INFO, "Re-registering previous fallback configuration once more"); assertThatFirstFilterIsROCF(); }
public void doTest(String configFile) throws JoranException { JoranConfigurator configurator = new JoranConfigurator(); configurator.setContext(context); configurator.doConfigure(configFile); Appender<IAccessEvent> appender = context.getAppender("DB"); for (int i = 0; i < 10; i++) { IAccessEvent event = DummyAccessEventBuilder.buildNewAccessEvent(); appender.doAppend(event); } StatusPrinter.print(context); // check that there were no errors assertEquals(Status.INFO, statusChecker.getHighestLevel(0)); }
@Override public void addStatusEvent(Status s) { if (s.getLevel() != 0 || s.getEffectiveLevel() != 0) hadError = true; if (!hadError && s.getMessage().equals("Registering current configuration as safe fallback point")) { try { installReplacementStreams(); } catch (Exception e) { throw new RuntimeException(e); } } if (s.getMessage().equals("Logback context being closed via shutdown hook")) { if (replacementOut != null) replacementOut.flush(); if (replacementErr != null) replacementErr.flush(); System.setErr(originalErr); System.setOut(originalOut); } }
@Test public void testConfiguration() { // When AirbrakeLogbackAppender appender = new AirbrakeLogbackAppender(); appender.setContext(new LoggerContext()); appender.start(); List<Status> statusList = appender.getStatusManager().getCopyOfStatusList(); Assertions.assertThat(statusList).hasSize(2); // appender.stop(); // When with protocol appender.setUrl("https://www.example.org"); // When without protocol thrown.expect(IllegalArgumentException.class); thrown.expectMessage("Wrong url: www.example.org"); appender.setUrl("www.example.org"); }
@Before public void beforeLogSystemInit() throws IOException, InterruptedException { kafka = TestKafka.createTestKafka(1); loggerContext = new LoggerContext(); loggerContext.putProperty("brokers.list", kafka.getBrokerList()); loggerContext.getStatusManager().add(new StatusListener() { @Override public void addStatusEvent(Status status) { if (status.getEffectiveLevel() > Status.INFO) { System.err.println(status.toString()); if (status.getThrowable() != null) { collector.addError(status.getThrowable()); } else { collector.addError(new RuntimeException("StatusManager reported warning: "+status.toString())); } } else { System.out.println(status.toString()); } } }); loggerContext.putProperty("HOSTNAME","localhost"); unit = new KafkaAppender<ILoggingEvent>(); final PatternLayout patternLayout = new PatternLayout(); patternLayout.setPattern("%msg"); patternLayout.setContext(loggerContext); patternLayout.start(); unit.setEncoder(new LayoutKafkaMessageEncoder(patternLayout, Charset.forName("UTF-8"))); unit.setTopic("logs"); unit.setName("TestKafkaAppender"); unit.setContext(loggerContext); unit.addProducerConfigValue(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, kafka.getBrokerList()); unit.setKeyingStrategy(new RoundRobinKeyingStrategy()); }
@AfterClass public static void checkStatusList() { sleep(); LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory(); StatusManager statusManager = lc.getStatusManager(); List<Status> statusList = statusManager.getCopyOfStatusList(); for (Status status : statusList) { int level = status.getLevel(); assertNotEquals(status.getMessage(), Status.ERROR, level); assertNotEquals(status.getMessage(), Status.WARN, level); } }
@Override protected void loadConfiguration(LoggingInitializationContext initializationContext, String location, LogFile logFile) { super.loadConfiguration(initializationContext, location, logFile); LoggerContext loggerContext = getLoggerContext(); stopAndReset(loggerContext); try { configureByResourceUrl(initializationContext, loggerContext, ResourceUtils.getURL(location)); } catch (Exception ex) { throw new IllegalStateException( "Could not initialize Logback logging from " + location, ex); } List<Status> statuses = loggerContext.getStatusManager().getCopyOfStatusList(); StringBuilder errors = new StringBuilder(); for (Status status : statuses) { if (status.getLevel() == Status.ERROR) { errors.append(errors.length() > 0 ? String.format("%n") : ""); errors.append(status.toString()); } } if (errors.length() > 0) { throw new IllegalStateException( String.format("Logback configuration error detected: %n%s", errors)); } }
public static int getHighestLevel(long threshold, StatusManager sm ) { List filteredList = StatusUtil.filterStatusListByTimeThreshold(sm.getCopyOfStatusList(), threshold); int maxLevel = 0; Iterator i$ = filteredList.iterator(); while(i$.hasNext()) { Status s = (Status)i$.next(); if(s.getLevel() > maxLevel) { maxLevel = s.getLevel(); } } return maxLevel; }
@Test public void one_error_status_should_be_reported_when_level_not_set_on_start_up_and_appender_reports_as_not_started() { appender.setEndpoint(""); appender.setLayout(layout); assertThat(appender.getLevel(), is(nullValue())); appender.start(); verify(sm, times(1)).add(any(Status.class)); assertFalse(appender.isStarted()); }
@Test public void one_error_status_should_be_reported_when_endpoint_not_set_on_start_up_and_appender_reports_as_not_started() { appender.setLevel(Level.ERROR); appender.setLayout(layout); assertThat(appender.getEndpoint(), is(nullValue())); appender.start(); verify(sm, times(1)).add(any(Status.class)); assertFalse(appender.isStarted()); }
@Test public void one_error_status_should_be_reported_when_layout_not_set_on_start_up_and_appender_reports_as_not_started() { appender.setLevel(Level.ERROR); appender.setEndpoint(""); assertThat(appender.getLayout(), is(nullValue())); appender.start(); verify(sm, times(1)).add(any(Status.class)); assertFalse(appender.isStarted()); }
@Test public void three_error_status_should_be_reported_when_endpoint_and_level_not_set_on_start_up_and_appender_reports_as_not_started() { assertThat(appender.getLevel(), is(nullValue())); assertThat(appender.getEndpoint(), is(nullValue())); assertThat(appender.getLayout(), is(nullValue())); appender.start(); verify(sm, times(3)).add(any(Status.class)); assertFalse(appender.isStarted()); }
@Test public void no_status_should_be_reported_when_endpoint_and_level_set_on_start_up_and_appender_reports_as_started() { appender.setLevel(Level.ERROR); appender.setEndpoint(""); appender.setLayout(layout); assertThat(appender.getLevel(), is(org.hamcrest.Matchers.any(Level.class))); assertThat(appender.getEndpoint(), is(org.hamcrest.Matchers.any(String.class))); appender.start(); verify(sm, never()).add(any(Status.class)); assertTrue(appender.isStarted()); }
public List<Status> getCopyOfStatusList() { synchronized (statusListLock) { List<Status> tList = new ArrayList<Status>(statusList); tList.addAll(tailBuffer.asList()); return tList; } }
private void fireStatusAddEvent(Status status) { synchronized (statusListenerListLock) { for (StatusListener sl : statusListenerList) { sl.addStatusEvent(status); } } }
private void targetWarn(String val) { Status status = new WarnStatus("[" + val + "] should be one of " + Arrays.toString(ConsoleTarget.values()), this); status.add(new WarnStatus( "Using previously set target, System.out by default.", this)); addStatus(status); }
public void addStatus(Status status) { if (context == null) { if (noContextWarning++ == 0) { System.out.println("LOGBACK: No context given for " + this); } return; } StatusManager sm = context.getStatusManager(); if (sm != null) { sm.add(status); } }
static void addStatus(Context context, Status s) { if (context == null) { System.out.println("Null context in " + ConfigurationWatchList.class.getName()); return; } StatusManager sm = context.getStatusManager(); if (sm == null) return; sm.add(s); }
void addStatusIfCountNotOverLimit(Status s) { ++statusCount; if (statusCount < STATUS_COUNT_LIMIT) { addStatus(s); } if (statusCount == STATUS_COUNT_LIMIT) { addStatus(s); addStatus(new InfoStatus("Will supress future messages regarding " + getDescription(), this)); } }
@Test public void testFilePropertyAfterRollingPolicy() { rfa.setContext(context); rfa.setRollingPolicy(tbrp); rfa.setFile("x"); StatusPrinter.print(context); StatusChecker statusChecker = new StatusChecker(context.getStatusManager()); statusChecker.assertContainsMatch(Status.ERROR, "File property must be set before any triggeringPolicy "); }
@Test public void testFilePropertyAfterTriggeringPolicy() { rfa.setContext(context); rfa.setTriggeringPolicy(new SizeBasedTriggeringPolicy<Object>()); rfa.setFile("x"); StatusChecker statusChecker = new StatusChecker(context.getStatusManager()); statusChecker.assertContainsMatch(Status.ERROR, "File property must be set before any triggeringPolicy "); }
/** * Test for http://jira.qos.ch/browse/LOGBACK-796 */ @Test public void testFileShouldNotMatchFileNamePattern() { rfa.setContext(context); rfa.setFile(CoreTestConstants.OUTPUT_DIR_PREFIX + "x-2013-04.log"); tbrp.setFileNamePattern(CoreTestConstants.OUTPUT_DIR_PREFIX + "x-%d{yyyy-MM}.log"); tbrp.start(); rfa.setRollingPolicy(tbrp); rfa.start(); StatusChecker statusChecker = new StatusChecker(context); final String msg = "File property collides with fileNamePattern. Aborting."; boolean containsMatch = statusChecker.containsMatch(Status.ERROR, msg); assertTrue("Missing error: " + msg, containsMatch); }
@Test public void illFormedXML() { TrivialStatusListener tsl = new TrivialStatusListener(); tsl.start(); String filename = CoreTestConstants.TEST_SRC_PREFIX + "input/joran/" + "illformed.xml"; context.getStatusManager().add(tsl); try { doTest(filename); } catch (Exception e) { } assertEquals(1, tsl.list.size()); Status s0 = tsl.list.get(0); assertTrue(s0.getMessage().startsWith(CoreConstants.XML_PARSING)); }
@Test public void testParsingOfXMLWithAttributesAndBodyText() throws Exception { List<StaxEvent> seList = doTest("event1.xml"); assertTrue(statusChecker.getHighestLevel(0) == Status.INFO); //dump(seList); assertEquals(11, seList.size()); assertEquals("test", seList.get(0).getName()); assertEquals("badBegin", seList.get(1).getName()); StartEvent startEvent = (StartEvent) seList.get(7); assertEquals("John Doe", startEvent.getAttributeByName("name").getValue()); assertEquals("XXX&", ((BodyEvent) seList.get(8)).getText()); }
@Test public void testProcessingOfTextWithEntityCharacters() throws Exception { List<StaxEvent> seList = doTest("ampEvent.xml"); StatusManager sm = context.getStatusManager(); assertTrue(statusChecker.getHighestLevel(0) == Status.INFO); //dump(seList); assertEquals(3, seList.size()); BodyEvent be = (BodyEvent) seList.get(1); assertEquals("xxx & yyy", be.getText()); }
@Test public void testAttributeProcessing() throws Exception { List<StaxEvent> seList = doTest("inc.xml"); StatusManager sm = context.getStatusManager(); assertTrue(statusChecker.getHighestLevel(0) == Status.INFO); assertEquals(4, seList.size()); StartEvent se = (StartEvent) seList.get(1); Attribute attr = se.getAttributeByName("increment"); assertNotNull(attr); assertEquals("1", attr.getValue()); }
@Test public void test1() throws Exception { List<SaxEvent> seList = doTest("event1.xml"); assertTrue(statusChecker.getHighestLevel(0) == Status.INFO); //dump(seList); assertEquals(11, seList.size()); }
@Test public void test2() throws Exception { List<SaxEvent> seList = doTest("ampEvent.xml"); StatusManager sm = context.getStatusManager(); assertTrue(statusChecker.getHighestLevel(0) == Status.INFO); //dump(seList); assertEquals(3, seList.size()); BodyEvent be = (BodyEvent) seList.get(1); assertEquals("xxx & yyy", be.getText()); }
@Test public void test3() throws Exception { List<SaxEvent> seList = doTest("inc.xml"); StatusManager sm = context.getStatusManager(); assertTrue(statusChecker.getHighestLevel(0) == Status.INFO); //dump(seList); assertEquals(4, seList.size()); StartEvent se = (StartEvent) seList.get(1); Attributes attr = se.getAttributes(); assertNotNull(attr); assertEquals("1", attr.getValue("increment")); }