package org.araqne.log.api; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Locale; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; import org.apache.felix.ipojo.annotations.Component; import org.apache.felix.ipojo.annotations.Provides; import org.apache.felix.ipojo.annotations.Requires; import org.araqne.cron.MinutelyJob; @MinutelyJob @Component(name = "time-rolling-log-writer-factory") @Provides public class TimeRollingLogWriterFactory extends AbstractLoggerFactory implements Runnable { @Requires private LoggerRegistry loggerRegistry; private ConcurrentMap<String, TimeRollingLogWriter> writers = new ConcurrentHashMap<String, TimeRollingLogWriter>(); @Override public String getName() { return "totimefile"; } @Override public String getDisplayGroup(Locale locale) { if (locale != null && locale.equals(Locale.KOREAN)) return "로컬"; if(locale != null && locale.equals(Locale.CHINESE)) return "本地"; return "Local"; } @Override public List<Locale> getLocales() { return Arrays.asList(Locale.ENGLISH, Locale.KOREAN, Locale.JAPANESE, Locale.CHINESE); } @Override public String getDisplayName(Locale locale) { if (locale != null && locale.equals(Locale.KOREAN)) return "시간별 롤링 로그 파일"; if (locale != null && locale.equals(Locale.JAPANESE)) return "時間別ローリングログファイル"; if (locale != null && locale.equals(Locale.CHINESE)) return "写入滚动文件(时间)"; return "Time Rolling Log File"; } @Override public String getDescription(Locale locale) { if (locale != null && locale.equals(Locale.KOREAN)) return "실시간으로 시간대별 롤링 로그 파일을 생성합니다."; if (locale != null && locale.equals(Locale.JAPANESE)) return "実時間で時間別のローリングログファイルを作ります。"; if (locale != null && locale.equals(Locale.CHINESE)) return "写入基于指定时间滚动的文件。"; return "write time rolling log file"; } @Override public List<LoggerConfigOption> getConfigOptions() { LoggerConfigOption loggerName = new StringConfigType("source_logger", t("Source logger name", "원본 로거 이름", "元ロガー名", "源数据采集器"), t("Full name of data source logger", "네임스페이스를 포함한 원본 로거 이름", "ネームスペースを含む元ロガー名", "包含名字空间的源数据采集器名称"), true); LoggerConfigOption filePath = new StringConfigType("file_path", t("file path", "파일 경로", "ファイル経路", "文件路径"), t( "rolling file path", "롤링되는 파일 경로", "ローリングされるファイル経路", "滚动文件路径"), true, "local-file"); LoggerConfigOption rotateInterval = new StringConfigType("rotate_interval", t("rotate interval", "파일 교체 주기", "ファイル交代周期", "滚动周期"), t("hour or day", "시간 (hour) 혹은 일자 (day)", "時間(hour)か日(day)", "1小时(输入hour)或者1天(输入day)"), true); LoggerConfigOption charsetName = new StringConfigType("charset", t("charset", "문자 집합", "文字セット", "字符集"), t( "utf-8 by default", "기본값은 utf-8", "基本値はutf-8", "默认值为utf-8"), false, "charset"); return Arrays.asList(loggerName, filePath, rotateInterval, charsetName); } private Map<Locale, String> t(String enText, String koText, String jpText, String cnText) { Map<Locale, String> m = new HashMap<Locale, String>(); m.put(Locale.ENGLISH, enText); m.put(Locale.KOREAN, koText); m.put(Locale.JAPANESE, jpText); m.put(Locale.CHINESE, cnText); return m; } @Override public void run() { // force flush at least per 1min for (TimeRollingLogWriter writer : new ArrayList<TimeRollingLogWriter>(writers.values())) { writer.flush(); } } @Override protected Logger createLogger(LoggerSpecification spec) { String fullName = spec.getNamespace() + "\\" + spec.getName(); TimeRollingLogWriter writer = new TimeRollingLogWriter(spec, this, loggerRegistry); TimeRollingLogWriter old = writers.putIfAbsent(fullName, writer); if (old != null) throw new IllegalStateException("duplicated time rolling log writer: " + fullName); return writer; } @Override public void deleteLogger(String namespace, String name) { String fullName = namespace + "\\" + name; writers.remove(fullName); super.deleteLogger(namespace, name); } }