Once Logger.info(String) invoked there is the following implementation underneath
// org.apache.log4j.Category 661 public 662 void info(Object message) { 663 if(repository.isDisabled(Level.INFO_INT)) 664 return; 665 if(Level.INFO.isGreaterOrEqual(this.getEffectiveLevel())) 666 forcedLog(FQCN, Level.INFO, message, null); 667 }The
repository
object is of Hierarchy type which is specialized in retrieving loggers by name and maintaining hierarchy of loggers.
FQCN - is fully qualified name of the calling category class
After couple of self-explanatory checks we've got forcedLog(String,Priority,Object,Throwable)
method called which creates a new logging event and call the appenders.
//org.apache.log4j.Category 389 protected 390 void forcedLog(String fqcn, Priority level, Object message, Throwable t) { 391 callAppenders(new LoggingEvent(fqcn, this, level, message, t)); 392 }At this point lets stop a while with LoggingEvent object. The LoggingEvent is a container object gathering calling category class name, actual message, optional throwable and timestamp. Timestamp can be passed in to the constructor, or is initialized with
System.currentTimeMillis()
during creation. It will be used by appenders for various reasons before eventually get them logged (eg. filtering).
The loggingEvent is passed to callAppenders method:
//org.apache.log4j.Category 198 public 199 void callAppenders(LoggingEvent event) { 200 int writes = 0; 201 202 for(Category c = this; c != null; c=c.parent) { 203 // Protected against simultaneous call to addAppender, removeAppender,... 204 synchronized(c) { 205 if(c.aai != null) { 206 writes += c.aai.appendLoopOnAppenders(event); 207 } 208 if(!c.additive) { 209 break; 210 } 211 } 212 } 213 214 if(writes == 0) { 215 repository.emitNoAppenderWarning(this); 216 } 217 }It goes through all the parent categories (loggers) ending with RootLogger inherently having no parent. Usually the root logger is the one having appenders. Field aai (of AppenderAttachableImpl type) is used to kept list of appenders.
// org.apache.log4j.helpers.AppenderAttachableImpl 57 public 58 int appendLoopOnAppenders(LoggingEvent event) { 59 int size = 0; 60 Appender appender; 61 62 if(appenderList != null) { 63 size = appenderList.size(); 64 for(int i = 0; i < size; i++) { 65 appender = (Appender) appenderList.elementAt(i); 66 appender.doAppend(event); 67 } 68 } 69 return size; 70 }That is all from the core side. Now the actual appenders goes into play.
Brak komentarzy:
Prześlij komentarz