OSDN Git Service

スタートアップ処理の改善
[jindolf/Jindolf.git] / src / main / java / jp / sfjp / jindolf / log / LogUtils.java
1 /*
2  * logging common
3  *
4  * License : The MIT License
5  * Copyright(c) 2011 olyutorskii
6  */
7
8 package jp.sfjp.jindolf.log;
9
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;
16
17 /**
18  * ロギングの各種ユーティリティ。
19  */
20 public final class LogUtils {
21
22     /** ログ管理用パーミッション。 */
23     public static final LoggingPermission PERM_LOGCTL =
24             new LoggingPermission("control", null);
25
26     private static final PrintStream STDERR = System.err;
27     private static final String ERRMSG_LOGSECURITY =
28             "セキュリティ設定により、ログ設定を変更できませんでした";
29
30
31     /**
32      * 隠しコンストラクタ。
33      */
34     private LogUtils(){
35         assert false;
36     }
37
38
39     /**
40      * ログ操作のアクセス権があるか否か判定する。
41      * @return アクセス権があればtrue
42      */
43     public static boolean hasLoggingPermission(){
44         SecurityManager manager = System.getSecurityManager();
45         boolean result = hasLoggingPermission(manager);
46         return result;
47     }
48
49     /**
50      * ログ操作のアクセス権があるか否か判定する。
51      * @param manager セキュリティマネージャ
52      * @return アクセス権があればtrue
53      */
54     public static boolean hasLoggingPermission(SecurityManager manager){
55         if(manager == null) return true;
56
57         try{
58             manager.checkPermission(PERM_LOGCTL);
59         }catch(SecurityException e){
60             return false;
61         }
62
63         return true;
64     }
65
66     /**
67      * ルートロガーを返す。
68      * @return ルートロガー
69      */
70     public static Logger getRootLogger(){
71         Logger rootLogger = Logger.getLogger("");
72         return rootLogger;
73     }
74
75     /**
76      * ルートロガーの初期化を行う。
77      * ルートロガーの既存ハンドラを全解除し、
78      * {@link MomentaryHandler}ハンドラを登録する。
79      * @param useConsoleLog trueなら
80      * {@link java.util.logging.ConsoleHandler}も追加する。
81      */
82     public static void initRootLogger(boolean useConsoleLog){
83         if( ! hasLoggingPermission() ){
84             STDERR.println(ERRMSG_LOGSECURITY);
85             return;
86         }
87
88         Logger rootLogger = getRootLogger();
89
90         Handler[] oldHandlers = rootLogger.getHandlers();
91         for(Handler handler : oldHandlers){
92             rootLogger.removeHandler(handler);
93         }
94
95         Handler momentaryHandler = new MomentaryHandler();
96         rootLogger.addHandler(momentaryHandler);
97
98         if(useConsoleLog){
99             Handler consoleHandler = new ConsoleHandler();
100             rootLogger.addHandler(consoleHandler);
101         }
102
103         return;
104     }
105
106     /**
107      * ルートロガーに新ハンドラを追加する。
108      * ルートロガー中の全{@link MomentaryHandler}型ハンドラに
109      * 蓄積されていたログは、新ハンドラに一気に転送される。
110      * {@link MomentaryHandler}型ハンドラはルートロガーから削除される。
111      * ログ操作のパーミッションがない場合、何もしない。
112      * @param newHandler 新ハンドラ
113      */
114     public static void switchHandler(Handler newHandler){
115         if( ! hasLoggingPermission() ) return;
116
117         Logger logger = getRootLogger();
118
119         List<MomentaryHandler> momentaryHandlers =
120                 MomentaryHandler.getMomentaryHandlers(logger);
121         MomentaryHandler.removeMomentaryHandlers(logger);
122
123         logger.addHandler(newHandler);
124
125         for(MomentaryHandler momentaryHandler : momentaryHandlers){
126             momentaryHandler.transfer(newHandler);
127             momentaryHandler.close();
128         }
129
130         return;
131     }
132
133 }