Как я могу установить языковой стандарт, используемый java.util.logging.Formatter?

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

В java.util.Formatter (в отличие от java.util.logging.Formatter) вы можете предоставить конструктору аргумент Locale, так что вы можете указать локаль ROOT, если хотите:

Formatter formatter = new Formatter(sb, Locale.ROOT);

(Подобным образом вы можете передать аргумент языкового стандарта в String.format().) Но java.util.logging.Formatter и его потомки, похоже, не имеют никакого способа указать используемый языковой стандарт.

Я мог бы расширить Formatter или SimpleFormatter и переопределить format() или formatMessage(), но я не вижу там никаких крючков для форматирования только отметки даты / времени, поэтому мне пришлось бы переписать функциональность форматирования всего LogRecord. Это, вероятно, не так уж и плохо, но это намного менее оптимально (и более подвержено ошибкам), чем предоставление локали.

Моя текущая стратегия состоит в том, чтобы скопировать и изменить код для SimpleFormatter.format (), но, конечно, это избавляет приложение от будущих исправлений этого метода.

Есть другие идеи?

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
0
684
1

Ответы 1

Вы можете изменить формат SimpleFormatter на любой шаблон, поддерживаемый java.util.Formatter. Как вы отметили, Locale.getDefault() всегда используется SimpleFormatter для форматирования записей журнала.

Попробуйте использовать java.util.Locale.setDefault​(Locale.Category, Locale), чтобы установить категорию формата Locale.ROOT. Например:

java.util.Locale.setDefault​(Locale.Category.FORMAT, Locale.ROOT);

В противном случае вы должны попытаться отформатировать отдельные части даты, как описано в документации java.util.logging.SimpleFormatter:

java.util.logging.SimpleFormatter.format = "%1$tb %1$td, %1$tY %1$tl:%1$tM:%1$tS %1$Tp %2$s%n%4$s: %5$s%n"

Заявление об ограничении ответственности: Я разработчик контента для com.sun.mail.util.logging, включенного в проект JavaMail. Если вы используете com.sun.mail.util.logging.CompactFormatter, он выбирает языковой стандарт пакета ресурсов, назначенный записи журнала. Если вы не используете локализацию, тогда null используется в качестве языкового стандарта по умолчанию должен быть таким же, как ROOT.

В крайнем случае, вам придется откатить свою собственную или найти стороннюю библиотеку.

Спасибо, изменение языкового стандарта по умолчанию - хорошая идея, как заставить SimpleFormatter использовать языковой стандарт, который я хочу. Однако в этом случае установка языкового стандарта по умолчанию может привести к возникновению эффектов пульсации, которых я не хочу, например, изменение текущего направления макета.

LarsH 02.04.2018 18:38

@LarsH Возможно, пора подать RFE против OpenJDK, чтобы улучшить обработку локали при ведении журнала. Я действительно думаю, что он должен использовать языковой стандарт пакета ресурсов, но разрешить пользователю выбирать языковой стандарт в качестве свойства ведения журнала также является хорошей идеей. Если у вас есть доступ к JavaMail, вы можете использовать CompactFormatter с настраиваемым шаблоном.

jmehrens 02.04.2018 20:01

Другие вопросы по теме