1package com.cheogram.android;
2
3import android.util.Log;
4import java.util.logging.*;
5
6/**
7 * Make JUL work on Android.
8 * https://stackoverflow.com/a/9047282/8611
9 */
10public class AndroidLoggingHandler extends Handler {
11
12 public static void reset(Handler rootHandler) {
13 Logger rootLogger = LogManager.getLogManager().getLogger("");
14 Handler[] handlers = rootLogger.getHandlers();
15 for (Handler handler : handlers) {
16 rootLogger.removeHandler(handler);
17 }
18 rootLogger.addHandler(rootHandler);
19 }
20
21 @Override
22 public void close() {
23 }
24
25 @Override
26 public void flush() {
27 }
28
29 @Override
30 public void publish(LogRecord record) {
31 if (!super.isLoggable(record))
32 return;
33
34 String name = record.getLoggerName();
35 int maxLength = 30;
36 String tag = name.length() > maxLength ? name.substring(name.length() - maxLength) : name;
37
38 try {
39 int level = getAndroidLevel(record.getLevel());
40 final var msg = new SimpleFormatter().format(record);
41 Log.println(level, tag, msg);
42 if (record.getThrown() != null) {
43 Log.println(level, tag, Log.getStackTraceString(record.getThrown()));
44 }
45 } catch (RuntimeException e) {
46 Log.e("AndroidLoggingHandler", "Error logging message.", e);
47 }
48 }
49
50 static int getAndroidLevel(Level level) {
51 int value = level.intValue();
52
53 if (value >= Level.SEVERE.intValue()) {
54 return Log.ERROR;
55 } else if (value >= Level.WARNING.intValue()) {
56 return Log.WARN;
57 } else if (value >= Level.INFO.intValue()) {
58 return Log.INFO;
59 } else {
60 return Log.DEBUG;
61 }
62 }
63}