20 return logger;
21 } else {
22 // It should be impossible to arrive here
23 return null; // but let's keep the compiler happy.
24 }
25 }
26 }
其他的方法实现则比较简单,对LoggerRepository来说,它也可以像其注册HierarchyEventListener监听器,每当向一个Logger添加或删除Appender,该监听器就会触发。
1 public interface HierarchyEventListener {
2 public void addAppenderEvent(Category cat, Appender appender);
3 public void removeAppenderEvent(Category cat, Appender appender);
4 }
5 private Vector listeners;
6 public void addHierarchyEventListener(HierarchyEventListener listener) {
7 if (listeners.contains(listener)) {
8 LogLog.warn("Ignoring attempt to add an existent listener.");
9 } else {
10 listeners.addElement(listener);
11 }
12 }
13 public void fireAddAppenderEvent(Category logger, Appender appender) {
14 if (listeners != null) {
15 int size = listeners.size();
16 HierarchyEventListener listener;
17 for (int i = 0; i < size; i++) {
18 listener = (HierarchyEventListener) listeners.elementAt(i);
19 listener.addAppenderEvent(logger, appender);
20 }
21 }
22 }
23 void fireRemoveAppenderEvent(Category logger, Appender appender) {
24 if (listeners != null) {
25 int size = listeners.size();
26 HierarchyEventListener listener;
27 for (int i = 0; i < size; i++) {
28 listener = (HierarchyEventListener) listeners.elementAt(i);
29 listener.removeAppenderEvent(logger, appender);
30 }
31 }
32 }
Hierarchy中保存了threshold字段,用户可以设置threshold。而对root实例,它在够着Hierarchy时就被指定了。getCurrentLoggers()方法将ht集合中所有的Logger实例取出。shutdown()方法遍历所有Logger实例以及root实例,调用所有附加其上的Appender的close()方法,并将所有Appender实例从Logger中移除,最后触发AppenderRemove事件。resetConfiguration()方法将root字段初始化、调用shutdown()方法移除Logger中的所有Appender、初始化所有Logger实例当不将其从LoggerRepository中移除、清楚rendererMap和throwableRender中的数据。
RendererSupport接口
RendererSupport接口支持用户为不同的类设置相应的ObjectRender实例,从而可以从被渲染的类中或许更多的信息而不是默认的调用其toString()方法。
1 public interface RendererSupport {
2 public RendererMap getRendererMap();
3 public void setRenderer(Class renderedClass, ObjectRenderer renderer);
4 }
5 Hierarchy类实现了RenderedSupprt接口,而且它的实现也很简单:
6 RendererMap rendererMap;
7 public Hierarchy(Logger root) {
8
9 rendererMap = new RendererMap();
10
11 }
12 public void addRenderer(Class classToRender, ObjectRenderer or) {
13 rendererMap.put(classToRender, or);
14 }
15 public RendererMap getRendererMap() {
16 return rendererMap;
17 }
18 public void setRenderer(Class renderedClass, ObjectRenderer renderer) {
19 rendererMap.put(renderedClass, renderer);
20 }
在RendererMap类实现中,它使用Hastable保存被渲染的类实例和相应的ObjectRender实例,在查找一个类是否存在注册的渲染类时,如果它本身没有找到,需要向上尝试其父类和接口是否有注册相应的ObjectRender类,如果都没有找到,则返回默认的ObjectRender。
1 public ObjectRenderer get(Class clazz) {
2 ObjectRenderer r = null;
3 for (Class c = clazz; c != null; c = c.getSuperclass()) {
4 r = (ObjectRenderer) map.get(c);
5 if (r != null) {
6 return r;
7 }
8 r = searchInterfaces(c);
9 if (r != null)
10 return r;
11 }
12 return defaultRenderer;
13 }
14 ObjectRenderer searchInterfaces(Class c) {
15 ObjectRenderer r = (ObjectRenderer) ma