[logback-user] Error counter appender

Lukas Zapletal lzap at seznam.cz
Wed Feb 25 18:06:24 CET 2009


Great, thank you.

Is there somethink like "null" layout in the head distribution? I do not
need that. Well I will create one...

Thank you I hope it will help.

ps - is this context

LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory();

the very same as the context I use when I log like this

Logger logger = LoggerFactory.getLogger(MyClass.class);
logger.debug("Hello world.");

if both statements are in the same source file?

LZ


Ceki Gulcu wrote:
> 
> Hello Lukas,
> 
> I just added one line to your code, after errAppender.start();
> 
>    errAppender.start();
>    StatusPrinter.print(lc);   <--- this is the new line of code
> 
> This resulted in the following output (edited for brevity):
> 
> INFO in c.q.l.c.LoggerContext - Could NOT find resource logback-test.xml]
> INFO in c.q.l.c.LoggerContext - Could NOT find resource [logback.xml]
> INFO in c.q.l.c.LoggerContext - Setting up default configuration.
> ERROR in ErrorCounterAppender - No layout set for the appender named
> [null].
> 
> The error message explains the reasons for the behavior you are seeing.
> 
> HTH,
> 
> Lukas Zapletal wrote:
>> Hello,
>> 
>> I need to count number of error messages coming thru SLF4J into my app
>> and
>> integrate this number with System.exit() call at the end of the program.
>> 
>> I have found that best solution would be to write an appender and
>> dynamicaly
>> add it in the code of my application. I am configuring logging by calling
>> LoggerConfigurer (loading XML file) but I do not want to have my appender
>> in
>> this configuration - I do want to configure it dynamically not allowing
>> user
>> to modify XML and disable this error counter appender. But this does not
>> work - the new appender method append() is never called. I think there is
>> a
>> problem with context or something. Here is the code:
>> 
>> public class Test {
>> 	final org.slf4j.Logger logger =
>> org.slf4j.LoggerFactory.getLogger(Test.class);
>> 
>> 	public void main(String[] args) {
>>            String fileName = "myfile.xml";
>> 	    LoggerContext lc = (LoggerContext)
>> LoggerFactory.getILoggerFactory();
>> 
>> 		try {
>> 			JoranConfigurator configurator = new JoranConfigurator();
>> 			configurator.setContext(lc);
>> 			// the context was probably already configured by default
>> configuration
>> 			// rules
>> 			lc.shutdownAndReset();
>> 			configurator.doConfigure(fileName);
>> 
>> 			ErrorCounterAppender errAppender = new ErrorCounterAppender();
>> 			Logger root = LoggerFactory.getLogger(LoggerContext.ROOT_NAME);
>> 			errAppender.setContext(lc);
>> 			errAppender.start();
>> 			((ch.qos.logback.classic.Logger) root).addAppender(errAppender);
>> 			logger.error("TEST");
>> 			logger.info("Number of errors: {}", errAppender.getErrorNumber()); //
>> prints 0
>> 			System.exit(errAppender.getErrorNumber()); // returns 0 (instead of 1)
>> 
>> 		} catch (Throwable t) {
>> 			logger.warn("Cannot configure logger from location " + fileName, t);
>> 		}
>> 		StatusPrinter.print(lc);
>> 	}
>> 
>> }
>> 
>> I think there must be some problem in the context or something. Or is
>> there
>> any better solution of my problem? Here is my appender:
>> 
>> /**
>> 
>>  * Thread-safe implementation of error counter appender for LogBack.
>> 
>>  */
>> 
>> public class ErrorCounterAppender extends AppenderBase<LoggingEvent> {
>> 
>> 
>> 
>> 	AtomicInteger errorCounter = new AtomicInteger(0);
>> 
>> 
>> 
>> 	private Layout<LoggingEvent> layout;
>> 
>> 
>> 
>> 	public ErrorCounterAppender() {
>> 
>> 	}
>> 
>> 
>> 
>> 	@Override
>> 
>> 	public void setLayout(Layout<LoggingEvent> layout) {
>> 
>> 		this.layout = layout;
>> 
>> 	}
>> 
>> 
>> 
>> 	public void resetErrorNumber() {
>> 
>> 		errorCounter.set(0);
>> 
>> 	}
>> 
>> 
>> 
>> 	public int getErrorNumber() {
>> 
>> 		return errorCounter.get();
>> 
>> 	}
>> 
>> 
>> 
>> 	@Override
>> 
>> 	public void start() {
>> 
>> 		if (this.layout == null) {
>> 
>> 			addError("No layout set for the appender named [" + name + "].");
>> 
>> 			return;
>> 
>> 		}
>> 
>> 		super.start();
>> 
>> 	}
>> 
>> 
>> 
>> 	@Override
>> 
>> 	public void append(LoggingEvent event) {
>> 
>> 		if (event == null)
>> 
>> 			return;
>> 
>> 
>> 
>> 		if (Level.ERROR == event.getLevel()) {
>> 
>> 			errorCounter.incrementAndGet();
>> 
>> 		}
>> 
>> 	}
>> 
>> }
>> 
>> 
>> 
>> -----
>> --
>> Lukas Zapletal
>> http://lukas.zapletalovi.com
> 
> -- 
> Ceki Gülcü
> Logback: The reliable, generic, fast and flexible logging framework for
> Java.
> http://logback.qos.ch
> _______________________________________________
> Logback-user mailing list
> Logback-user at qos.ch
> http://qos.ch/mailman/listinfo/logback-user
> 
> 


-----
--
Lukas Zapletal
http://lukas.zapletalovi.com
-- 
View this message in context: http://www.nabble.com/Error-counter-appender-tp22205463p22207166.html
Sent from the Logback User mailing list archive at Nabble.com.



More information about the Logback-user mailing list