Main repository of MikuMikuStudio
Révision | 0e64a42cacf90ff5f3fab4bd1923950df375d67a (tree) |
---|---|
l'heure | 2013-03-15 10:28:07 |
Auteur | iwgeric@gmail.com <iwgeric@gmai...> |
Commiter | iwgeric@gmail.com |
Fix issue with how Android logging is handled.
- Replaced standard Android logging Handler to avoid Android issue with only logging Level.INFO -> Level.SEVERE log records.
- Moved logging Handler initialization to AndroidHarness instead of in JmeSystem so logging in AndroidHarness and app startup could be logged.
git-svn-id: http://jmonkeyengine.googlecode.com/svn/trunk@10485 75d07b2b-3a1a-0410-a2c5-0572b91ccdca
@@ -31,6 +31,7 @@ import com.jme3.system.android.OGLESContext; | ||
31 | 31 | import com.jme3.util.AndroidLogHandler; |
32 | 32 | import java.io.PrintWriter; |
33 | 33 | import java.io.StringWriter; |
34 | +import java.util.logging.Handler; | |
34 | 35 | import java.util.logging.Level; |
35 | 36 | import java.util.logging.LogManager; |
36 | 37 | import java.util.logging.Logger; |
@@ -65,7 +66,7 @@ public class AndroidHarness extends Activity implements TouchListener, DialogInt | ||
65 | 66 | */ |
66 | 67 | @Deprecated |
67 | 68 | protected boolean eglConfigVerboseLogging = false; |
68 | - | |
69 | + | |
69 | 70 | /** |
70 | 71 | * set to 2, 4 to enable multisampling. |
71 | 72 | */ |
@@ -160,7 +161,8 @@ public class AndroidHarness extends Activity implements TouchListener, DialogInt | ||
160 | 161 | |
161 | 162 | @Override |
162 | 163 | public void onCreate(Bundle savedInstanceState) { |
163 | - LogManager.getLogManager().getLogger("").addHandler(new AndroidLogHandler()); | |
164 | + initializeLogHandler(); | |
165 | + | |
164 | 166 | logger.fine("onCreate"); |
165 | 167 | super.onCreate(savedInstanceState); |
166 | 168 |
@@ -198,7 +200,7 @@ public class AndroidHarness extends Activity implements TouchListener, DialogInt | ||
198 | 200 | settings.setSamples(antiAliasingSamples); |
199 | 201 | settings.setResolution(disp.getWidth(), disp.getHeight()); |
200 | 202 | settings.put(AndroidConfigChooser.SETTINGS_CONFIG_TYPE, eglConfigType); |
201 | - | |
203 | + | |
202 | 204 | |
203 | 205 | // Create application instance |
204 | 206 | try { |
@@ -473,6 +475,24 @@ public class AndroidHarness extends Activity implements TouchListener, DialogInt | ||
473 | 475 | } |
474 | 476 | } |
475 | 477 | |
478 | + /** | |
479 | + * Removes the standard Android log handler due to an issue with not logging | |
480 | + * entries lower than INFO level and adds a handler that produces | |
481 | + * JME formatted log messages. | |
482 | + */ | |
483 | + protected void initializeLogHandler() { | |
484 | + Logger log = LogManager.getLogManager().getLogger(""); | |
485 | + for (Handler handler : log.getHandlers()) { | |
486 | + if (log.getLevel() != null && log.getLevel().intValue() <= Level.FINE.intValue()) { | |
487 | + Log.v("AndroidHarness", "Removing Handler class: " + handler.getClass().getName()); | |
488 | + } | |
489 | + log.removeHandler(handler); | |
490 | + } | |
491 | + Handler handler = new AndroidLogHandler(); | |
492 | + log.addHandler(handler); | |
493 | + handler.setLevel(Level.ALL); | |
494 | + } | |
495 | + | |
476 | 496 | public void initialize() { |
477 | 497 | app.initialize(); |
478 | 498 | if (handleExitHook) { |
@@ -115,34 +115,7 @@ public class JmeAndroidSystem extends JmeSystemDelegate { | ||
115 | 115 | } |
116 | 116 | |
117 | 117 | initialized = true; |
118 | - try { | |
119 | -// JmeFormatter formatter = new JmeFormatter(); | |
120 | -// Handler consoleHandler = new AndroidLogHandler(); | |
121 | -// consoleHandler.setFormatter(formatter); | |
122 | -// | |
123 | -// Logger log = Logger.getLogger(""); | |
124 | -// for (Handler h : log.getHandlers()) { | |
125 | -// log.removeHandler(h); | |
126 | -// } | |
127 | -// log.addHandler(consoleHandler); | |
128 | - Logger log = Logger.getLogger(JmeAndroidSystem.class.getName()); | |
129 | - boolean bIsLogFormatSet = false; | |
130 | - do { | |
131 | - log.setLevel(Level.ALL); | |
132 | - if (log.getHandlers().length == 0) { | |
133 | - log = log.getParent(); | |
134 | - if (log != null) { | |
135 | - for (Handler h : log.getHandlers()) { | |
136 | - h.setFormatter(new JmeFormatter()); | |
137 | - h.setLevel(Level.ALL); | |
138 | - bIsLogFormatSet = true; | |
139 | - } | |
140 | - } | |
141 | - } | |
142 | - } while (log != null && !bIsLogFormatSet); | |
143 | - } catch (SecurityException ex) { | |
144 | - logger.log(Level.SEVERE, "Security error in creating log file", ex); | |
145 | - } | |
118 | + | |
146 | 119 | logger.log(Level.INFO, "Running on {0}", getFullName()); |
147 | 120 | } |
148 | 121 |
@@ -15,22 +15,31 @@ import java.util.logging.Logger; | ||
15 | 15 | */ |
16 | 16 | public class AndroidLogHandler extends Handler { |
17 | 17 | |
18 | - private static final Formatter THE_FORMATTER = new Formatter() { | |
18 | + private static final Formatter JME_FORMATTER = new JmeFormatter() { | |
19 | + | |
20 | + String lineSeperator = System.getProperty("line.separator"); | |
21 | + | |
19 | 22 | @Override |
20 | - public String format(LogRecord r) { | |
21 | - Throwable thrown = r.getThrown(); | |
22 | - if (thrown != null) { | |
23 | - StringWriter sw = new StringWriter(); | |
24 | - PrintWriter pw = new PrintWriter(sw); | |
25 | - sw.write(r.getMessage()); | |
26 | - sw.write("\n"); | |
27 | - thrown.printStackTrace(pw); | |
28 | - pw.flush(); | |
29 | - return sw.toString(); | |
30 | - } else { | |
31 | - return r.getMessage(); | |
23 | + public String format(LogRecord record) { | |
24 | + StringBuilder sb = new StringBuilder(); | |
25 | + | |
26 | + sb.append(record.getLevel().getLocalizedName()).append(" "); | |
27 | + sb.append(formatMessage(record)).append(lineSeperator); | |
28 | + | |
29 | + if (record.getThrown() != null) { | |
30 | + try { | |
31 | + StringWriter sw = new StringWriter(); | |
32 | + PrintWriter pw = new PrintWriter(sw); | |
33 | + record.getThrown().printStackTrace(pw); | |
34 | + pw.close(); | |
35 | + sb.append(sw.toString()); | |
36 | + } catch (Exception ex) { | |
37 | + } | |
32 | 38 | } |
39 | + | |
40 | + return sb.toString(); | |
33 | 41 | } |
42 | + | |
34 | 43 | }; |
35 | 44 | |
36 | 45 | @Override |
@@ -44,14 +53,13 @@ public class AndroidLogHandler extends Handler { | ||
44 | 53 | @Override |
45 | 54 | public void publish(LogRecord record) { |
46 | 55 | |
47 | - try { | |
48 | - Level level = record.getLevel(); | |
49 | - String tag = record.getLoggerName(); | |
50 | - String msg = THE_FORMATTER.format(record); | |
51 | - int lv = getAndroidLevel(level); | |
52 | - | |
53 | - Log.println(lv, tag, msg); | |
56 | + int level = getAndroidLevel(record.getLevel()); | |
57 | +// String tag = loggerNameToTag(record.getLoggerName()); | |
58 | + String tag = record.getLoggerName(); | |
54 | 59 | |
60 | + try { | |
61 | + String message = JME_FORMATTER.format(record); | |
62 | + Log.println(level, tag, message); | |
55 | 63 | } catch (RuntimeException e) { |
56 | 64 | Log.e("AndroidHandler", "Error logging message.", e); |
57 | 65 | } |
@@ -77,4 +85,26 @@ public class AndroidLogHandler extends Handler { | ||
77 | 85 | return Log.DEBUG; |
78 | 86 | } |
79 | 87 | } |
88 | + | |
89 | + /** | |
90 | + * Returns the short logger tag for the given logger name. | |
91 | + * Traditionally loggers are named by fully-qualified Java classes; this | |
92 | + * method attempts to return a concise identifying part of such names. | |
93 | + */ | |
94 | + public static String loggerNameToTag(String loggerName) { | |
95 | + // Anonymous logger. | |
96 | + if (loggerName == null) { | |
97 | + return "null"; | |
98 | + } | |
99 | + | |
100 | + int length = loggerName.length(); | |
101 | + int lastPeriod = loggerName.lastIndexOf("."); | |
102 | + | |
103 | + if (lastPeriod == -1) { | |
104 | + return loggerName; | |
105 | + } | |
106 | + | |
107 | + return loggerName.substring(lastPeriod + 1); | |
108 | + } | |
109 | + | |
80 | 110 | } |