1 4 package org.oddjob.logging; 5 6 import java.util.ArrayList ; 7 import java.util.Collections ; 8 import java.util.HashMap ; 9 import java.util.Iterator ; 10 import java.util.LinkedList ; 11 import java.util.List ; 12 import java.util.Map ; 13 import java.util.Stack ; 14 15 import org.apache.log4j.Logger; 16 17 22 public class LogArchive { 23 private static final Logger logger = Logger.getLogger(LogArchive.class); 24 25 26 private final int maxHistory; 27 28 private final String archive; 29 30 33 private final LinkedList events = new LinkedList (); 34 35 36 private final Map listeners = new HashMap (); 37 38 43 public LogArchive(String archive, int maxHistory) { 44 this.archive = archive; 45 this.maxHistory = maxHistory; 46 } 47 48 53 public long getLastMessageNumber() { 54 synchronized (events) { 55 if (events.size() == 0) { 56 return -1; 57 } 58 LogEvent logEvent = (LogEvent) events.getFirst(); 59 return logEvent.getNumber(); 60 } 61 } 62 63 69 public void addEvent(LogLevel level, String line) { 70 synchronized (events) { 71 LogEvent event = new LogEvent(archive, getLastMessageNumber() + 1, level, 72 line); 73 events.addFirst(event); 74 while (events.size() > maxHistory) { 75 events.removeLast(); 76 } 77 for (Iterator it = listeners.entrySet().iterator(); it.hasNext();) { 79 Map.Entry entry = (Map.Entry ) it.next(); 80 LogListener listener = (LogListener) entry.getKey(); 81 LogLevel listenerLevel = (LogLevel) entry.getValue(); 82 if (level.isLessThan(listenerLevel)) { 83 continue; 84 } 85 listener.logEvent(event); 86 } 87 } 88 } 89 90 99 public LogEvent[] retieveEvents(long from, int max) { 100 synchronized (events) { 101 List missed = new ArrayList (); 102 int count = 0; 103 for (Iterator it = events.iterator(); it.hasNext() && count < max; count++) { 105 LogEvent event = (LogEvent) it.next(); 106 if (event.getNumber() == from) { 107 break; 108 } 109 missed.add(event); 110 } 111 Collections.reverse(missed); 112 return (LogEvent[]) missed.toArray(new LogEvent[0]); 113 } 114 } 115 116 124 public void addListener(LogListener l, 125 LogLevel level, long last, int history) { 126 synchronized (events) { 127 Stack missed = new Stack (); 128 int count = 0; 129 for (Iterator it = events.iterator(); it.hasNext() && count < history; count++) { 131 LogEvent event = (LogEvent) it.next(); 132 if (event.getNumber() == last) { 133 break; 134 } 135 if (event.getLevel().isLessThan(level)) { 136 continue; 137 } 138 missed.push(event); 139 } 140 while (!missed.empty()) { 142 LogEvent event = (LogEvent) missed.pop(); 143 l.logEvent(event); 144 } 145 listeners.put(l, level); 146 } 147 } 148 149 154 public boolean removeListener(LogListener l) { 155 synchronized (events) { 156 return !(listeners.remove(l) == null); 157 } 158 } 159 160 165 public String getArchive() { 166 return archive; 167 } 168 169 174 public int getMaxHistory() { 175 return maxHistory; 176 } 177 178 } 179
| Popular Tags
|