Я хочу використовувати журнали у своїй програмі. Я чув про java.util.logging , але не знаю, як почати.
Чи є приклади того, що я можу зробити з веденням журналу? Як я можу використовувати журнал у власній програмі?
Я хочу використовувати журнали у своїй програмі. Я чув про java.util.logging , але не знаю, як почати.
Чи є приклади того, що я можу зробити з веденням журналу? Як я можу використовувати журнал у власній програмі?
Відповіді:
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, щоб відповідати цьому рядку, що часто отримує більше результатів, ніж вам потрібно переглядати.
.fine()
метод для реєстрації, але я не можу зробити так, щоб повідомлення відображалися ...
Слід оголосити реєстратор таким чином:
private final static Logger LOGGER = Logger.getLogger(MyClass.class.getName());
тож якщо ви перефактуруєте назву свого класу, це випливає.
Я написав статтю про java logger із прикладами тут .
Існує багато прикладів, а також різних типів для проведення лісозаготівлі. Погляньте на пакет 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");
}
}
Main.class.getSimpleName()
? Таким чином інструмент рефакторингу збирається змінити його належним чином, якщо це потрібно, і все-таки він не такий прискіпливий, як ваше друге рішення.
SLF4J - кращий фасад лісозаготівлі, ніж Apache Commons Logging (ACL). Він має мости до інших фреймворків журналів, прямі дзвінки в протокол ACL, Log4J або Java Util Logging проходять через SLF4J, так що ви можете направити весь вихід на один файл журналу, якщо хочете, лише з одним файлом конфігурації журналу. Чому ваша програма використовує декілька фреймів реєстрації? Тому, що сторонні бібліотеки, якими ви користуєтесь, особливо старіші, ймовірно.
SLF4J підтримує різні реалізації журналів. Він може виводити все до стандартного виходу, використовувати Log4J або Logback (рекомендується через Log4J).
Я б запропонував вам скористатися утилітою журналу журналу Apache. Він високо масштабований і підтримує окремі файли журналів для різних реєстраторів. Дивіться тут .