Я использую 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 (), но, конечно, это избавляет приложение от будущих исправлений этого метода.
Есть другие идеи?




Вы можете изменить формат 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.
В крайнем случае, вам придется откатить свою собственную или найти стороннюю библиотеку.
@LarsH Возможно, пора подать RFE против OpenJDK, чтобы улучшить обработку локали при ведении журнала. Я действительно думаю, что он должен использовать языковой стандарт пакета ресурсов, но разрешить пользователю выбирать языковой стандарт в качестве свойства ведения журнала также является хорошей идеей. Если у вас есть доступ к JavaMail, вы можете использовать CompactFormatter с настраиваемым шаблоном.
Спасибо, изменение языкового стандарта по умолчанию - хорошая идея, как заставить SimpleFormatter использовать языковой стандарт, который я хочу. Однако в этом случае установка языкового стандарта по умолчанию может привести к возникновению эффектов пульсации, которых я не хочу, например, изменение текущего направления макета.