OSDN Git Service

dmg作成バージョンの取得方法の修正
[charactermanaj/CharacterManaJ.git] / src / charactermanaj / util / ApplicationLoggerConfigurator.java
1 package charactermanaj.util;\r
2 \r
3 import java.io.File;\r
4 import java.io.FileInputStream;\r
5 import java.io.FileOutputStream;\r
6 import java.io.InputStream;\r
7 import java.util.logging.ConsoleHandler;\r
8 import java.util.logging.Level;\r
9 import java.util.logging.LogManager;\r
10 import java.util.logging.Logger;\r
11 \r
12 \r
13 public final class ApplicationLoggerConfigurator {\r
14 \r
15         private static final String LOGGING_PROPERTIES = "logging.properties";\r
16         \r
17         private ApplicationLoggerConfigurator() {\r
18                 super();\r
19         }\r
20 \r
21         public static void configure() {\r
22                 // ログマネージャ.\r
23                 // 初期時にJRE等にある初期設定がなされている.\r
24                 LogManager logManager = LogManager.getLogManager();\r
25 \r
26                 // 設定を一旦クリアする.\r
27                 // ルートロガーがInfoになり、ハンドラはすべてリセット。ルートロガー以外の設定は空にされる.\r
28                 logManager.reset();\r
29 \r
30                 Exception configurationError = null;\r
31                 try {\r
32                         // ユーザーごとのアプリケーション設定ディレクトリ上の設定ファイルを取得する.\r
33                         File appDataDir = ConfigurationDirUtilities.getUserDataDir();\r
34                         File logConfig = new File(appDataDir, LOGGING_PROPERTIES);\r
35 \r
36                         if ( !logConfig.exists()) {\r
37                                 // ユーザ指定のロギングプロパティがない場合、リソースからコピーする\r
38                                 copyDefaultLogProperty(logConfig);\r
39                         }\r
40                         \r
41                         InputStream is = null;\r
42                         if (logConfig.exists()) {\r
43                                 // ユーザー指定のロギングプロパティがある場合\r
44                                 is = new FileInputStream(logConfig);\r
45                         } else {\r
46                                 // リソース上のロギングプロパティ\r
47                                 is = ApplicationLoggerConfigurator.class.getResourceAsStream("/" + LOGGING_PROPERTIES);\r
48                         }\r
49                         if (is != null) {\r
50                                 try {\r
51                                         // ログを再設定する.\r
52                                         logManager.readConfiguration(is);\r
53 \r
54                                 } finally {\r
55                                         is.close();\r
56                                 }\r
57                         }\r
58 \r
59                 } catch (Exception ex) {\r
60                         // 初期化に失敗した場合はログに記録するために例外を保存するが、\r
61                         // 処理は継続する.\r
62                         configurationError = ex;\r
63                 }\r
64                 \r
65                 // ロガーを取得\r
66                 Logger logger = Logger.getLogger(ApplicationLoggerConfigurator.class.getName());\r
67                 \r
68                 // 初期化時に失敗した場合、デフォルトのコンソールハンドラを設定し、ログに出力する.\r
69                 if (configurationError != null) {\r
70                         logger.addHandler(new ConsoleHandler());\r
71                         logger.addHandler(new ApplicationLogHandler());\r
72                         logger.log(Level.WARNING, "LogConfigurationFailed", configurationError);\r
73                 }\r
74                 \r
75                 // 初期化時のログ\r
76                 logger.info("open logger.");\r
77                 logger.info("application configuration: baseDir="\r
78                                 + ConfigurationDirUtilities.getApplicationBaseDir() + "  appData="\r
79                                 + ConfigurationDirUtilities.getUserDataDir());\r
80         }\r
81         \r
82         /**\r
83          * デフォルトのログプロパティをユーザディレクトリにコピーする.\r
84          * @param logConfig ユーザディレクトリ上のログプロパティファイル位置\r
85          */\r
86         private static void copyDefaultLogProperty(File logConfig) {\r
87                 try {\r
88                         InputStream is = ApplicationLoggerConfigurator.class\r
89                                 .getResourceAsStream("/" + LOGGING_PROPERTIES);\r
90                         if (is != null) {\r
91                                 try {\r
92                                         FileOutputStream fos = new FileOutputStream(logConfig);\r
93                                         try {\r
94                                                 byte buf[] = new byte[4096];\r
95                                                 for (;;) {\r
96                                                         int rd = is.read(buf);\r
97                                                         if (rd <= 0) {\r
98                                                                 break;\r
99                                                         }\r
100                                                         fos.write(buf, 0, rd);\r
101                                                 }\r
102                                         } finally {\r
103                                                 fos.close();\r
104                                         }\r
105                                 } finally {\r
106                                         is.close();\r
107                                 }\r
108                         }\r
109 \r
110                 } catch (Exception ex) {\r
111                         ex.printStackTrace();\r
112                         // 失敗しても継続する\r
113                 }\r
114         }\r
115 }\r