AndroidLoggingHandler.java

 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}