Я хочу использовать логи в моей программе. Я слышал о java.util.logging , но не знаю с чего начать.
Есть ли примеры того, что я могу сделать с ведением журнала? Как бы я использовал вход в свою собственную программу?
Я хочу использовать логи в моей программе. Я слышал о java.util.logging , но не знаю с чего начать.
Есть ли примеры того, что я могу сделать с ведением журнала? Как бы я использовал вход в свою собственную программу?
Ответы:
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, чтобы соответствовать этой строке, что часто дает вам больше выходных данных, чем вам нужно просмотреть.
.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. Он хорошо масштабируется и поддерживает отдельные файлы журналов для разных регистраторов. Смотрите здесь .