
ceki <ceki@...> writes:
On 28.07.2012 00:37, Noremac wrote:
Thank you for the reply. The problem I've been having is that I'm not finding accessible some of the specific pieces of the configuration. How can I test that the markerEvaluator is set up correctly? There's no method to get the evaluator, only to set the evaluator.
Could you post your code and config file so we can have a look at it? You can change logger names etc to protect the innocent.
So the config file is basic, as I will be programmatically adding appenders: <?xml version="1.0" encoding="UTF-8"?> <configuration> <!-- Conversion rules; a custom pattern token to use in the pattern layout class --> <conversionRule conversionWord="threadHash" converterClass="stuff.util.logging.ThreadHashConverter" /> <!-- Write logs out to the console --> <appender name="stdout" class="ch.qos.logback.core.ConsoleAppender"> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <pattern>[\(%-6threadHash\) app=iv %d{yyyy-MM-dd HH:mm:ss.SSS}] %-5level %-25logger{25} - %msg%n</pattern> </encoder> </appender> <!-- Specify what loggers are to be used --> <root level="INFO"> <appender-ref ref="stdout"/> </root> </configuration> The appender is added like so: public void createAdminNotifyAppender(LoggerContext lc, AppConfigPropertiesReader propReader) { logger.info("Setting up logback admin_notify logging"); //Set up the admin notify appender programatically (needs to use the properties from the propReader above) OnMarkerEvaluator markerEvaluator = new OnMarkerEvaluator(); markerEvaluator.setContext(lc); markerEvaluator.addMarker("ADMIN_NOTIFY"); markerEvaluator.setName("ADMIN_NOTIFY"); markerEvaluator.start(); PatternLayout patternLayout = new PatternLayout(); patternLayout.setContext(lc); patternLayout.setPattern("[\\(%-6threadHash\\) app=iv %d{yyyy-MM-dd HH:mm:ss.SSS}] %-5level %-25logger{25} - %msg%n"); patternLayout.start(); String adminEmails = propReader.getProperty("adminEmail"); SMTPAppender adminNotifyAppender = new SMTPAppender(); adminNotifyAppender.setContext(lc); adminNotifyAppender.setEvaluator(markerEvaluator); adminNotifyAppender.setSMTPHost(propReader.getProperty("mail.smtp.host")); if (adminEmails == null) { logger.error("No Admin Emails are set! No one will be notified for system alerts"); } else { for (String adminEmail : adminEmails.split(",")) { adminNotifyAppender.addTo(adminEmail); }; } adminNotifyAppender.setFrom(propReader.getProperty("sysEmailAddressNoReply")); adminNotifyAppender.setSubject("System Alert! [" + propReader.getProperty("environment") + "]"); adminNotifyAppender.setLayout(patternLayout); adminNotifyAppender.setName("ADMIN_NOTIFY"); adminNotifyAppender.start(); Logger rootLogger = lc.getLogger(Logger.ROOT_LOGGER_NAME); rootLogger.addAppender(adminNotifyAppender); } and my test case is as follows: private void testSimpleSMTPAppenderSetup(LoggingMarker marker, String email, Logger rootLogger, AppConfigPropertiesReader propReader) { SMTPAppender smtpAppender = (SMTPAppender)rootLogger.getAppender(LoggingMarker.ADMIN_NOTIFY.getName()); //check that the necessary fields were set assertEquals("smtpHost set correctly", smtpAppender.getSMTPHost(), propReader.getProperty("mail.smtp.host")); assertEquals("from address set correctly", smtpAppender.getFrom(), propReader.getProperty("sysEmailAddressNoReply")); assertTrue("environment set correctly", smtpAppender.getSubject().contains(propReader.getProperty("environment"))); List<String> appenderEmailsWithSuffix = smtpAppender.getToAsListOfString(); List<String> appenderEmails = new ArrayList<String>(); String[] propEmails = propReader.getProperty("adminEmail").split(","); for (String emailAddress : appenderEmailsWithSuffix) { appenderEmails.add(emailAddress.replaceFirst("%nopex$", "")); } assertTrue("to-emails are set correctly", appenderEmails.containsAll(Arrays.asList(propEmails))); //TODO find a way to test that the logs are getting filtered by the markerEvaluator (or that it is there set on the logger) }