Хорошие примеры использования java.util.logging [закрыто]

273

Я хочу использовать логи в моей программе. Я слышал о java.util.logging , но не знаю с чего начать.

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

Ренато Динхани
источник
7
Вы можете начать здесь: slf4j.org/manual.html
Джереми
1
Я согласен со Стивеном Васселларо. Я устал от того, что полезные предметы были уничтожены из-за полицейской работы над темой. Кроме того, с уважением не согласен с Джереми, поскольку OP спросил о java.util.logging. Я также интересуюсь родной регистрацией (спасибо за ответ, grwww!)
NOP
Для записи данных в одну строку: log.log (Level.INFO, «Мое сообщение {0}», новый объект [] {myDataId});
Митя Густин

Ответы:

335

java.util.logging избавляет вас от необходимости хранить в приложении еще один jar-файл, и это хорошо работает с хорошим Formatter.

В общем, в начале каждого класса вы должны иметь:

private static final Logger LOGGER = Logger.getLogger( ClassName.class.getName() );

Затем вы можете просто использовать различные возможности класса Logger .


Используйте Level.FINEдля всего, что отлаживается на верхнем уровне потока выполнения:

LOGGER.log( Level.FINE, "processing {0} entries in loop", list.size() );

Используйте Level.FINER/ Level.FINESTвнутри циклов и в местах, где вам не всегда нужно видеть столько подробностей при отладке основных проблем потока:

LOGGER.log( Level.FINER, "processing[{0}]: {1}", new Object[]{ i, list.get(i) } );

Используйте параметризованные версии средств ведения журналов, чтобы не создавать тонны мусора конкатенации строк, за которым GC придется не отставать. Object[]как указано выше, это дешево, обычно в стеке.


При обработке исключений всегда регистрируйте полную информацию об исключении:

try {
    ...something that can throw an ignorable exception
} catch( Exception ex ) {
    LOGGER.log( Level.SEVERE, ex.toString(), ex );
}

Я всегда передаю ex.toString()здесь сообщение, потому что тогда, когда я " grep -n" для " Exception" в файлах журнала, я тоже вижу сообщение. В противном случае он будет на следующей строке вывода, сгенерированного дампом стека, и вам потребуется более продвинутый RegEx, чтобы соответствовать этой строке, что часто дает вам больше выходных данных, чем вам нужно просмотреть.

grwww
источник
3
Пишет ли это в какой-то файл? Я не мог заставить его работать еще в моей программе. У меня есть исходная строка, которая у вас есть, но пока ничего не получалось.
Даг Хауф,
5
Как вы просматриваете журналы? Библиотека, которую я использую, инициализирует объекты Logger и использует .fine()метод для регистрации, но я не могу заставить сообщения отображаться ...
Anubian Noob
7
Я программирую на Java с 1998 года. Я всегда считал, что ведение журналов на Java - это гораздо больше головной боли, чем нужно. Это, безусловно, самое простое объяснение того, как войти в Java, которое я читал. Сжато тоже.
Стив Маклеод
30
Интересно, что никто не упомянул, где можно найти файлы журналов.
Ахмедов
4
Если вам интересно, куда идут журналы, убедитесь, что вы установили обработчик для регистратора. Чтобы просто вывести журналы на консоль, используйте новый ConsoleHandler и добавьте его в свой регистратор, используя метод addHandler. Убедитесь, что вы вызываете setLevel как в логгере, так и в обработчике.
Крейг Браун
67

Должен объявить регистратор следующим образом:

private final static Logger LOGGER = Logger.getLogger(MyClass.class.getName());

так что если вы реорганизуете имя своего класса, это следует.

Я написал статью о java logger с примерами здесь .

hanoo
источник
53

Есть много примеров, а также различных типов для ведения журнала. Посмотрите на пакет java.util.logging .

Пример кода:

import java.util.logging.Logger;

public class Main {

  private static Logger LOGGER = Logger.getLogger("InfoLogging");

  public static void main(String[] args) {
    LOGGER.info("Logging an INFO-level message");
  }
}

Без жесткого кодирования имени класса :

import java.util.logging.Logger;

public class Main {
  private static final Logger LOGGER = Logger.getLogger(
    Thread.currentThread().getStackTrace()[0].getClassName() );

  public static void main(String[] args) {
    LOGGER.info("Logging an INFO-level message");
  }
}
Анкит
источник
15
Почему бы не установить имя журнала как Main.class.getSimpleName()? Таким образом, инструмент рефакторинга изменит его должным образом, если это необходимо, и все же он не так неуклюж, как ваше второе решение.
Пиюсн
3
Создание трассировки стека для имени логгера является взломанным, медленным и неортодоксальным. Это также сломает и даст вам странные имена для прокси-серверов AOP или других экстраординарных байт-кодировок.
Адам Гент
9
-1 для стековой трассировки. Это медленно и потенциально препятствует оптимизации компилятора.
phooji
4
Почему «медлительность» имеет значение при инициализации регистратора? Упоминания о медлительности - это то, что большинство людей назвали бы преждевременной оптимизацией (да, код выглядит немного хакерским).
Mikkom
3
@AndrewMcKinlay В какой ситуации это что-то ломает? Если предполагается, что тег logger совпадает с именем класса, это вполне нормально. Инструменты рефакторинга будут переименовывать его автоматически, в то время как, если это была жестко запрограммированная строка, инструмент рефакторинга может либо пропустить ее, либо сказать «Вы также хотите переименовать это?».
Pijusn
23

SLF4J - лучший фасад регистрации, чем Apache Commons Logging (ACL). Он имеет мосты к другим системам журналирования, делая прямые вызовы в ACL, Log4J или Java Util Logging через SLF4J, так что вы можете направить весь вывод в один файл журнала, если хотите, только с одним файлом конфигурации журнала. Почему ваше приложение будет использовать несколько каркасов? Потому что сторонние библиотеки, которые вы используете, особенно старые, возможно.

SLF4J поддерживает различные реализации журналирования. Он может выводить все на стандартный вывод, использовать Log4J или Logback (рекомендуется через Log4J).

http://www.slf4j.org/

http://logback.qos.ch/

bcody
источник
9

Я бы использовал Minlog , лично. Это очень просто, так как класс регистрации состоит из нескольких сотен строк кода.

Крис Деннетт
источник
3
Для минимального следа, это библиотека для выбора.
h3xStream
0

Я бы посоветовал вам воспользоваться утилитой регистрации общих файлов Apache. Он хорошо масштабируется и поддерживает отдельные файлы журналов для разных регистраторов. Смотрите здесь .

nIKUNJ
источник
11
Хорошее предложение! тем не менее попробуйте ответить на то, что они просят, иначе просто оставьте комментарий;)
Ordiel