Logger и Log в Android

242
21 ноября 2017, 21:21

В библиотеке https://github.com/kochedykov/jlibmodbus/blob/master/src/com/invertor/modbus/Modbus.java Используется логирование посредством java.util.logging.Logger

final static private Logger log = Logger.getLogger(Modbus.class.getName());

Я хочу приспособить эту библиотеку к своему Android-приложению. Как правильно реализовать связь между Logger и android.util.Log? Вообще надо использовать Log от Android в данном случае?

Answer 1

В своем мультиплатформенной аппе, я это реализовал так:

1) Сначала пишем свой логгер, типа:

public class MyLogger {
    static MyLoggable myLoggable;
    public static void attachLogger(MyLoggable myLoggableInstance) {
        myLoggable=myLoggableInstance;
    }
    public static void info(String tag, String message, Throwable exception) {
        myLoggable.info(tag, message, exception);
    }
    public static void info(String tag, String message) {
        myLoggable.info(tag, message);
    }
    //blah-blah
}

Далее декларируем интерфейс, который можно будет прицепить к этому логгеру:

public interface MyLoggable {
    public void info(String tag, String message, Throwable exception);
    public void info(String tag, String message);
    public void warning(String tag, String message, Throwable exception);
    public void warning(String tag, String message);
    public void error(String tag, String message, Throwable exception);
    public void error(String tag, String message);
    public void verbose(String tag, String message, Throwable exception);
    public void verbose(String tag, String message);
    public void debug(String tag, String message, Throwable exception);
    public void debug(String tag, String message);
}

Теперь пишем класс, который является оберткой на стандартным Java логгером:

public class JavaUtilLogger implements MyLoggable {
    static final char TAB='\t';
    private java.util.Logger rootLogger;
    public JavaUtilLogger(String category) {
        rootLogger = LogManager.getLogManager().getLogger(category);
    }

    @Override
    public void info(String tag, String message, Throwable exception) {
        rootLogger.log(Level.INFO, tag+TAB+message, exception);
    }
    //blah-blah
}

В случае Android обертка будет такой:

public class AndroidLogger implements MyLoggable {
    @Override
    public void info(String tag, String message, Throwable exception) {
        Log.i(tag, message, exception);
    }
    //blah-blah
}

Остается только "прицепить" нужный логгер в зависимости от ситуации:

MyLogger.attachLogger(new AndroidLogger()); //для платформы Android
MyLogger.attachLogger(new JavaUtilLogger(Modbus.class.getName())); //для plain Java

теперь все вызовы где встречается java.util.Logger меняем на свой MyLogger и все.

READ ALSO
Как сделать плавное движение строки по Canvas?

Как сделать плавное движение строки по Canvas?

Я написал отдельный класс потока, в котором двигаю строку по канвасуИ проблема в том, что если я делаю

233
файл занят другим процессом Commons FileUpload Java

файл занят другим процессом Commons FileUpload Java

Либа commons fileuploadЕсть код для загрузки файлов:

245
Поворот экрана при запуске приложения Android

Поворот экрана при запуске приложения Android

Как сделать, чтобы при запуске приложения оно запускалось сразу в landscape моде, игнорируя текущую ориентацию телефона?

271
Inline инициализация полей

Inline инициализация полей

Рихтер в свой книге пишет, что если инициализировать поля inline, то в каждом конструкторе генерируется одинаковый IL-код инициализации этих...

275