001package com.hammurapi.common.concurrent; 002 003import java.util.ArrayList; 004import java.util.Collection; 005import java.util.Iterator; 006import java.util.Map; 007import java.util.concurrent.ConcurrentHashMap; 008import java.util.logging.Level; 009import java.util.logging.LogRecord; 010 011/** 012 * Dispatches logging to several loggers. 013 * @author Pavel Vlasov 014 * 015 */ 016public class CompositeLogger implements Logger { 017 018 private Logger[] loggers; 019 020 public CompositeLogger(Logger... loggers) { 021 this.loggers = loggers; 022 } 023 024 public CompositeLogger(Iterator<Logger> lit) { 025 Collection<Logger> accumulator = new ArrayList<Logger>(); 026 while (lit.hasNext()) { 027 accumulator.add(lit.next()); 028 } 029 loggers = accumulator.toArray(new Logger[accumulator.size()]); 030 } 031 032 @Override 033 public void fine(String msg) { 034 for (Logger logger: loggers) { 035 logger.fine(msg); 036 } 037 } 038 039 @Override 040 public void finer(String msg) { 041 for (Logger logger: loggers) { 042 logger.finer(msg); 043 } 044 } 045 046 @Override 047 public void finest(String msg) { 048 for (Logger logger: loggers) { 049 logger.finest(msg); 050 } 051 } 052 053 @Override 054 public void info(String msg) { 055 for (Logger logger: loggers) { 056 logger.info(msg); 057 } 058 } 059 060 @Override 061 public void severe(String msg) { 062 for (Logger logger: loggers) { 063 logger.severe(msg); 064 } 065 } 066 067 @Override 068 public void warning(String msg) { 069 for (Logger logger: loggers) { 070 logger.warning(msg); 071 } 072 } 073 074 @Override 075 public void log(Level level, String msg) { 076 for (Logger logger: loggers) { 077 logger.log(level, msg); 078 } 079 } 080 081 @Override 082 public void log(Level level, String msg, Object param1) { 083 for (Logger logger: loggers) { 084 logger.log(level, msg, param1); 085 } 086 } 087 088 @Override 089 public void log(Level level, String msg, Object[] params) { 090 for (Logger logger: loggers) { 091 logger.log(level, msg, params); 092 } 093 } 094 095 @Override 096 public void log(Level level, String msg, Throwable thrown) { 097 for (Logger logger: loggers) { 098 logger.log(level, msg, thrown); 099 } 100 } 101 102 @Override 103 public void log(LogRecord record) { 104 for (Logger logger: loggers) { 105 logger.log(record); 106 } 107 } 108 109 private Map<String, Logger> subLoggers = new ConcurrentHashMap<String, Logger>(); 110 111 @Override 112 public Logger getLogger(String name) { 113 Logger ret = subLoggers.get(name); 114 if (ret==null) { 115 Logger[] sLoggers = new Logger[loggers.length]; 116 for (int i=0; i<sLoggers.length; ++i) { 117 sLoggers[i]=loggers[i].getLogger(name); 118 } 119 ret = new CompositeLogger(sLoggers); 120 subLoggers.put(name, ret); 121 } 122 return ret; 123 } 124 125 @Override 126 public boolean isLoggable(Level level) { 127 for (Logger logger: loggers) { 128 if (logger.isLoggable(level)) { 129 return true; 130 } 131 } 132 return false; 133 } 134 135}