Хороші приклади використання java.util.logging [закрито]


273

Я хочу використовувати журнали у своїй програмі. Я чув про java.util.logging , але не знаю, як почати.

Чи є приклади того, що я можу зробити з веденням журналу? Як я можу використовувати журнал у власній програмі?


7
Ви можете почати тут: slf4j.org/manual.html
Джеремі

1
Я згоден зі Стівеном Васчелларо. Мені набридло бачити корисні предмети, знищені через те, що політика не закінчилася. Крім того, з повагою не згоден з Джеремі, коли ОП запитав про java.util.logging. Мене також цікавлять рідні лісозаготівлі (дякую за відповідь, grwww!)
NOP

Для реєстрації даних в одному рядку: log.log (Level.INFO, "Моє повідомлення {0}", новий Object [] {myDataId});
Мітя Густін

Відповіді:


335

java.util.logging утримує вас від необхідності підгортати ще один jar-файл із вашою програмою, і він добре працює з хорошим Форматтером.

Загалом, у верхній частині кожного класу ви повинні мати:

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, щоб відповідати цьому рядку, що часто отримує більше результатів, ніж вам потрібно переглядати.


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 із прикладами тут .


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()? Таким чином інструмент рефакторингу збирається змінити його належним чином, якщо це потрібно, і все-таки він не такий прискіпливий, як ваше друге рішення.
Pijusn

3
Зробити стек-трек для імені лісоруба - хак, повільно і неортодоксально. Він також порушить і дасть вам дивні імена для проксі-серверів AOP або іншого байтового кодування додаткової інформації.
Адам Гент

9
-1 для стек-трек-бізнесу. Це повільно і потенційно запобігає оптимізації компілятора.
phooji

4
Чому взагалі має значення "повільність" при ініціалізації реєстратора? Згадки про повільність - це те, що більшість людей називають передчасною оптимізацією (Так, код виглядає дещо хакерським).
mikkom

3
@AndrewMcKinlay У якій ситуації щось порушує? Якщо тег реєстратора повинен бути таким самим, як ім'я класу, це здається прекрасним. Інструменти рефакторингу автоматично перейменовують його, якщо це був жорстко закодований рядок, інструмент рефакторингу може або пропустити його, або сказати "Ви також хочете перейменувати це?".
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/


9

Я б особисто користувався minlog . Це надзвичайно просто, оскільки клас реєстрації - це кілька сотень рядків коду.


3
Для мінімального сліду вибирати саме цю бібліотеку.
h3xStream

0

Я б запропонував вам скористатися утилітою журналу журналу Apache. Він високо масштабований і підтримує окремі файли журналів для різних реєстраторів. Дивіться тут .


11
Гарна пропозиція! все ж спробуйте відповісти на те, що вони просять, інакше просто залиште коментар;)
Ордіель
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.