4 * License : The MIT License
5 * Copyright(c) 2011 olyutorskii
8 package jp.sfjp.jindolf.log;
10 import java.io.PrintStream;
11 import java.util.List;
12 import java.util.logging.ConsoleHandler;
13 import java.util.logging.Handler;
14 import java.util.logging.Logger;
15 import java.util.logging.LoggingPermission;
20 public final class LogUtils {
23 public static final LoggingPermission PERM_LOGCTL =
24 new LoggingPermission("control", null);
26 private static final PrintStream STDERR = System.err;
27 private static final String ERRMSG_LOGPERM =
28 "セキュリティ設定により、ログ設定を変更できませんでした";
40 * ログ操作のアクセス権があるか否か判定する。
42 * @return アクセス権があればtrue
44 public static boolean hasLoggingPermission(){
45 SecurityManager manager = System.getSecurityManager();
46 boolean result = hasLoggingPermission(manager);
51 * ログ操作のアクセス権があるか否か判定する。
53 * @param manager セキュリティマネージャ
54 * @return アクセス権があればtrue
56 public static boolean hasLoggingPermission(SecurityManager manager){
57 if(manager == null) return true;
60 manager.checkPermission(PERM_LOGCTL);
61 }catch(SecurityException e){
73 public static Logger getRootLogger(){
74 Logger rootLogger = Logger.getLogger("");
81 * <p>ルートロガーの既存ハンドラを全解除し、
82 * {@link MomentaryHandler}ハンドラを登録する。
84 * @param useConsoleLog trueなら
85 * {@link java.util.logging.ConsoleHandler}も追加する。
87 public static void initRootLogger(boolean useConsoleLog){
88 if( ! hasLoggingPermission() ){
89 STDERR.println(ERRMSG_LOGPERM);
93 Logger rootLogger = getRootLogger();
95 Handler[] oldHandlers = rootLogger.getHandlers();
96 for(Handler handler : oldHandlers){
97 rootLogger.removeHandler(handler);
100 Handler momentaryHandler = new MomentaryHandler();
101 rootLogger.addHandler(momentaryHandler);
104 Handler consoleHandler = new ConsoleHandler();
105 rootLogger.addHandler(consoleHandler);
114 * <p>ルートロガー中の全{@link MomentaryHandler}型ハンドラに
115 * 蓄積されていたログは、新ハンドラに一気に転送される。
117 * <p>{@link MomentaryHandler}型ハンドラはルートロガーから削除される。
119 * <p>ログ操作のパーミッションがない場合、何もしない。
121 * @param newHandler 新ハンドラ
123 public static void switchHandler(Handler newHandler){
124 if( ! hasLoggingPermission() ) return;
126 Logger logger = getRootLogger();
128 List<MomentaryHandler> momentaryHandlers =
129 MomentaryHandler.getMomentaryHandlers(logger);
130 MomentaryHandler.removeMomentaryHandlers(logger);
132 logger.addHandler(newHandler);
134 momentaryHandlers.forEach(momentaryHandler -> {
135 momentaryHandler.transfer(newHandler);
136 momentaryHandler.close();