1 package net.sf.openrocket.logging;
3 import java.util.ArrayList;
4 import java.util.Collections;
5 import java.util.EnumMap;
9 * A logger that buffers a specific number of log lines from every log
10 * level. This prevents a multitude of lower-level lines from purging
11 * away important higher-level messages. The method {@link #getLogs()}
12 * combines these logs into their original (natural) order. A log line
13 * is also inserted stating the number of log lines of the particular
14 * level that have been purged from the buffer.
16 * @author Sampo Niskanen <sampo.niskanen@iki.fi>
18 public class LogLevelBufferLogger extends LogHelper {
20 private final EnumMap<LogLevel, BufferLogger> loggers =
21 new EnumMap<LogLevel, BufferLogger>(LogLevel.class);
26 * @param count the number of log lines from each level to buffer.
28 public LogLevelBufferLogger(int count) {
29 for (LogLevel level : LogLevel.values()) {
30 loggers.put(level, new BufferLogger(count));
35 public void log(LogLine line) {
36 // Delegate to the buffered logger of this level
37 loggers.get(line.getLevel()).log(line);
42 * Retrieve all buffered log lines in order. A log line is also added to indicate the number of
43 * log lines that have been purged for that log level.
45 * @return a list of log lines in order.
47 public List<LogLine> getLogs() {
48 List<LogLine> result = new ArrayList<LogLine>();
50 for (LogLevel level : LogLevel.values()) {
51 BufferLogger logger = loggers.get(level);
52 List<LogLine> logs = logger.getLogs();
53 int misses = logger.getOverwriteCount();
57 result.add(new LogLine(level, 0, 0, null,
58 "===== " + misses + " " + level + " lines removed but log is empty! =====",
61 result.add(new LogLine(level, logs.get(0).getLogCount(), 0, null,
62 "===== " + misses + " " + level + " lines removed =====", null));
68 Collections.sort(result);