Intereting Posts
Com.android.ddmlib.AdbCommandRejectedException: более одного устройства Это приложение или используемая им библиотека использует NSQuickDrawView, который устарел. Приложения должны прекратить использование QuickDraw и перейти к Quartz Разрешение на манифест не работает в Android 6 VelocityTracker вызывает сбои в Android 4.4 Добавить кнопку в дескриптор SlidingDrawer? Не удалось проверить, был ли будильник установлен AlarmManager В чем разница между DVM и ART? Почему DVM был официально заменен ART в Lollipop? Перемещаться от одного фрагмента к другому при нажатии кнопки Как перенаправить из одной активности в другую деятельность Включить блокировку кнопок на виртуальной клавиатуре Android Перечислите активность с помощью заголовка, нижнего колонтитула и опустошите все видимые StartActivity в подклассе приложения Чтение двоичных данных stdout из оболочки adb? Firebase Java Server для отправки push-уведомлений всем устройствам Странное поведение с использованием Java-тернарного оператора на Android

Как настроить java.util.logging на Android?

Я хочу использовать java.util.logging на Android. Я хочу настроить систему ведения журнала с помощью logging.properties. Но как я могу сказать Android с помощью конкретного файла конфигурации? Например, я поместил logging.properties в корневой каталог пути приложения. Как Android знает местоположение logging.properties.

благодаря

Solutions Collecting From Web of "Как настроить java.util.logging на Android?"

Это теперь FAQ для одного из моих проектов, надеюсь, что больше людей найдут это здесь: java.util.logging отлично работает на Android. Пожалуйста, не используйте что-либо еще в своем коде, фреймворки регистрации похожи на вредителей в мире Java.

Отказоустойчивый обработчик регистрации по умолчанию, поставляемый с Android, игнорирует любые сообщения журнала с уровнем более тонким, чем INFO. Вы не видите сообщения DEBUG и т. Д.

Причиной является вызов Log.isLoggable () в AndroidHandler.java:

https://github.com/android/platform_frameworks_base/blob/master/core/java/com/android/internal/logging/AndroidHandler.java

Вот как вы это исправите:

import android.util.Log; import java.util.logging.*; /** * Make JUL work on Android. */ public class AndroidLoggingHandler extends Handler { public static void reset(Handler rootHandler) { Logger rootLogger = LogManager.getLogManager().getLogger(""); Handler[] handlers = rootLogger.getHandlers(); for (Handler handler : handlers) { rootLogger.removeHandler(handler); } rootLogger.addHandler(rootHandler); } @Override public void close() { } @Override public void flush() { } @Override public void publish(LogRecord record) { if (!super.isLoggable(record)) return; String name = record.getLoggerName(); int maxLength = 30; String tag = name.length() > maxLength ? name.substring(name.length() - maxLength) : name; try { int level = getAndroidLevel(record.getLevel()); Log.println(level, tag, record.getMessage()); if (record.getThrown() != null) { Log.println(level, tag, Log.getStackTraceString(record.getThrown())); } } catch (RuntimeException e) { Log.e("AndroidLoggingHandler", "Error logging message.", e); } } static int getAndroidLevel(Level level) { int value = level.intValue(); if (value >= 1000) { return Log.ERROR; } else if (value >= 900) { return Log.WARN; } else if (value >= 800) { return Log.INFO; } else { return Log.DEBUG; } } } 

В основном коде активности / инициализации вашего приложения:

 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); AndroidLoggingHandler.reset(new AndroidLoggingHandler()); java.util.logging.Logger.getLogger("my.category").setLevel(Level.FINEST); ... 

TL; DR: Да, вы можете использовать некоторые магические свойства или команду оболочки adb или даже узнать, как глупый встроенный обработчик DalvikLogging.loggerNameToTag обработчика DalvikLogging.loggerNameToTag преобразует имена категорий в теги (которые вам нужно будет сделать для этих магических свойств и оболочки Команды), но зачем беспокоиться? Не достаточно ли достаточно регистрации?

Cbauer (Кристиан Бауэр?)

Ваш ответ качался! Я задумался. Просто добавление направлений для невежественного, как я.

Я искал это в течение нескольких недель. Я видел ваше сообщение выше, но не понял его полностью (ссылка на импорт машины Dalvik бросила меня)

Я нашел ваше рабочее решение здесь: http://mailinglists.945824.n3.nabble.com/Taking-on-Cling-td1516672.html

Решение отлично работает, все детализированное регулярное ведение журнала Java и вывод logcat. Вам нужно будет выкапывать несколько разных путей, используя, наконец, «FixedAndroidHandler.java» и «LoggingUtil.java». Следуйте за встроенной ссылкой на teleal, затем потяните FixedHandler из проекта Android PnP Browser и LoggingUtil из Teleal common.

Спасибо, Кристиан,

DD

Обычно используется android.util.Log для входа на Android. Существуют некоторые ключевые преимущества использования этого регистратора, такие как возможность использования adb logcat для просмотра вывода журнала, отправленного в эти журналы.

Вы можете попробовать поставить logging.properties в assets/ или res/raw/ . Если Android не выбирает их там, можно использовать java.util.logging.LogManager . ReadConfiguration (java.io.InputStream), чтобы принудительно загрузить его. (Вы можете использовать классы Ресурсы и AssetManager, чтобы получить файл как InputStream).

По крайней мере, на Android 4.3 с неизменным обработчиком, если вы используете

 adb shell setprop log.tag.YOURTAG DEBUG 

Вы можете видеть сообщения, записанные до уровня Level.FINE в logcat. Я не выяснил способ регистрации более высоких уровней, но этого достаточно для меня.

В случае, если один из вас хочет только перенаправить вывод java.util.logging из сторонних библиотек, это может быть довольно легко достигнуто с помощью SLF4J и его jul-to-slf4j bridge . Это работает также для операторов журнала FINE и FINEST , BTW.

Вот зависимость maven

 <dependency> <groupId>org.slf4j</groupId> <artifactId>jul-to-slf4j</artifactId> <version>${slf4j.version}</version> </dependency> 

Чтобы загрузить его, поместите следующее в свой класс Application , модуль Roboguice или где-нибудь еще, где он будет выполнен до вашего первого оператора журнала. (Настройка этого в assets/logging.properties похоже, не работает, к сожалению).

 /* * add SLF4JBridgeHandler to jul's root logger, should be done once * during the initialization phase of your application */ SLF4JBridgeHandler.install(); 

Вы можете либо

  • assets/logback.xml все свои операторы журналов из assets/logback.xml (используя logback-android ). См. Здесь для отображения уровней журнала.

  • Или просто использовать SLF4J-android для пересылки операторов журнала в logcat. Для этого просто введите следующую зависимость для вашего пути к классам, не требуется дальнейшая конфигурация:

     <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-android</artifactId> <version>${slf4j.version}</version> </dependency> 

Я успешно реализовал это

 <properties> <slf4j.version>1.7.6</slf4j.version> </properties> 

Примечание .

  • Пожалуйста, прочитайте часть документа jul-to-slf4j, который относится к производительности тщательно!
  • Если вы используете LogcatAppender, обязательно помните, что сообщения журнала JUL (кроме тех, которые имеют уровень более тонкий, чем INFO ), маршрутизируются на logcat с помощью android. Поэтому не забудьте применить соответствующие фильтры, чтобы избежать дублирования.