OSDN Git Service

Merge branch 'release/v4.101.4'
[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_LOGPERM =
28             "セキュリティ設定により、ログ設定を変更できませんでした";
29
30
31     /**
32      * 隠しコンストラクタ。
33      */
34     private LogUtils(){
35         assert false;
36     }
37
38
39     /**
40      * ログ操作のアクセス権があるか否か判定する。
41      *
42      * @return アクセス権があればtrue
43      */
44     public static boolean hasLoggingPermission(){
45         SecurityManager manager = System.getSecurityManager();
46         boolean result = hasLoggingPermission(manager);
47         return result;
48     }
49
50     /**
51      * ログ操作のアクセス権があるか否か判定する。
52      *
53      * @param manager セキュリティマネージャ
54      * @return アクセス権があればtrue
55      */
56     public static boolean hasLoggingPermission(SecurityManager manager){
57         if(manager == null) return true;
58
59         try{
60             manager.checkPermission(PERM_LOGCTL);
61         }catch(SecurityException e){
62             return false;
63         }
64
65         return true;
66     }
67
68     /**
69      * ルートロガーを返す。
70      *
71      * @return ルートロガー
72      */
73     public static Logger getRootLogger(){
74         Logger rootLogger = Logger.getLogger("");
75         return rootLogger;
76     }
77
78     /**
79      * ルートロガーの初期化を行う。
80      *
81      * <p>ルートロガーの既存ハンドラを全解除し、
82      * {@link MomentaryHandler}ハンドラを登録する。
83      *
84      * @param useConsoleLog trueなら
85      * {@link java.util.logging.ConsoleHandler}も追加する。
86      */
87     public static void initRootLogger(boolean useConsoleLog){
88         if( ! hasLoggingPermission() ){
89             STDERR.println(ERRMSG_LOGPERM);
90             return;
91         }
92
93         Logger rootLogger = getRootLogger();
94
95         Handler[] oldHandlers = rootLogger.getHandlers();
96         for(Handler handler : oldHandlers){
97             rootLogger.removeHandler(handler);
98         }
99
100         Handler momentaryHandler = new MomentaryHandler();
101         rootLogger.addHandler(momentaryHandler);
102
103         if(useConsoleLog){
104             Handler consoleHandler = new ConsoleHandler();
105             rootLogger.addHandler(consoleHandler);
106         }
107
108         return;
109     }
110
111     /**
112      * ルートロガーに新ハンドラを追加する。
113      *
114      * <p>ルートロガー中の全{@link MomentaryHandler}型ハンドラに
115      * 蓄積されていたログは、新ハンドラに一気に転送される。
116      *
117      * <p>{@link MomentaryHandler}型ハンドラはルートロガーから削除される。
118      *
119      * <p>ログ操作のパーミッションがない場合、何もしない。
120      *
121      * @param newHandler 新ハンドラ
122      */
123     public static void switchHandler(Handler newHandler){
124         if( ! hasLoggingPermission() ) return;
125
126         Logger logger = getRootLogger();
127
128         List<MomentaryHandler> momentaryHandlers =
129                 MomentaryHandler.getMomentaryHandlers(logger);
130         MomentaryHandler.removeMomentaryHandlers(logger);
131
132         logger.addHandler(newHandler);
133
134         momentaryHandlers.forEach(momentaryHandler -> {
135             momentaryHandler.transfer(newHandler);
136             momentaryHandler.close();
137         });
138
139         return;
140     }
141
142 }