Progress-servis55.ru

Новости из мира ПК
0 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Java util logging level

How to use log levels in java

I am developing an application where i need to use the logger functionality. I have read about different levels of logger which are:

I am not able to understand the usage of each logging level.

Can someone give me a good example showing all the logging levels and their usage?

9 Answers 9

Generally, you don’t need all those levels, SEVERE, WARNING, INFO, FINE might be enough. We’re using Log4J (not java.util.logging directly) and the following levels (which might differ in name from other logging frameworks):

ERROR: Any error/exception that is or might be critical. Our Logger automatically sends an email for each such message on our servers (usage: logger.error(«message»); )

WARN: Any message that might warn us of potential problems, e.g. when a user tried to log in with wrong credentials — which might indicate an attack if that happens often or in short periods of time (usage: logger.warn(«message»); )

INFO: Anything that we want to know when looking at the log files, e.g. when a scheduled job started/ended (usage: logger.info(«message»); )

DEBUG: As the name says, debug messages that we only rarely turn on. (usage: logger.debug(«message»); )

The beauty of this is that if you set the log level to WARN, info and debug messages have next to no performance impact. If you need to get additional information from a production system you just can lower the level to INFO or DEBUG for a short period of time (since you’d get much more log entries which make your log files bigger and harder to read). Adjusting log levels etc. can normally be done at runtime (our JBoss instance checks for changes in that config every minute or so).

This excerpt is from the following awesome post.

ERROR – something terribly wrong had happened, that must be investigated immediately. No system can tolerate items logged on this level. Example: NPE, database unavailable, mission critical use case cannot be continued.

WARN – the process might be continued, but take extra caution. Actually I always wanted to have two levels here: one for obvious problems where work-around exists (for example: “Current data unavailable, using cached values”) and second (name it: ATTENTION) for potential problems and suggestions. Example: “Application running in development mode” or “Administration console is not secured with a password”. The application can tolerate warning messages, but they should always be justified and examined.

INFO – Important business process has finished. In ideal world, administrator or advanced user should be able to understand INFO messages and quickly find out what the application is doing. For example if an application is all about booking airplane tickets, there should be only one INFO statement per each ticket saying “[Who] booked ticket from [Where] to [Where]“. Other definition of INFO message: each action that changes the state of the application significantly (database update, external system request).

DEBUG – Developers stuff. I will discuss later what sort of information deserves to be logged.

TRACE – Very detailed information, intended only for development. You might keep trace messages for a short period of time after deployment on production environment, but treat these log statements as temporary, that should or might be turned-off eventually. The distinction between DEBUG and TRACE is the most difficult, but if you put logging statement and remove it after the feature has been developed and tested, it should probably be on TRACE level.

PS: Read TRACE as VERBOSE

Java logging. Hello World

Вступление

Думаю, ни для кого не секрет, что такое логгеры и для чего они нужны. За время существования java было создано немало фреймворков логгирования. Среди самых известных можно выделить:

  • JUL — java.util.logging
  • log4j
  • JCL — jakarta commons logging
  • Logback
  • SLF4J — simple logging facade for java

В данной статье будет рассмотрен каждый из указанных выше фреймворков на уровне «hello world». Будут приведены простые примеры использования основного функционала и конфигурирования. Статья не преследует цель сравнения логгеров между собой и выявление лучшего из них, эту возможность автор оставляет за вами, уважаемые читатели. В конце статьи будут приведены источники, где можно получить более детальную информацию по каждому фреймворку. Также перед прочтением данной статьи рекомендую ознакомиться с публикацией «Java Logging: история кошмара», где описана история развития систем логгирования в Java.

System.err.println

Первым и самым примитивным способом логгирования был метод System.err.println. Думаю, комментарии излишние, достаточно взглянуть на приведенный ниже код:

Java.util.logging

Данный фреймворк включен в стандарт и поставляется вместе с JDK, поэтому ничего дополнительно скачивать и подключать вам не надо. JUL имеет следующие уровни логгирования по возрастанию: FINEST, FINER, FINE, CONFIG, INFO, WARNING, SEVERE, а так же ALL и OFF, включающий и отключающий все уровни соответственно.
Логгер создается вызовом одного из статических методов класса java.util.logging.Logger:

Методы логгера могут принимать в качестве аргументов строковые сообщения, шаблоны сообщений, исключения, ресурсы локализованных текстовок сообщений, а также, начиная с Java 8, поставщиков строковых сообщений:

Выделяется две группы методов: название которых соответствует уровню логгирования и методы log, loggp, logrb, принимающие уровень логгирования в качестве параметра с типом Level. Первая группа содержит методы двух типов: принимающих строковое сообщение или поставщика строковых сообщений:

Вторая группа методов имеет следующие вариации:

Теперь обратимся к конфигурации фреймворка. По умолчанию JUL будет выводить сообщения на консоль, однако можно задать конфигурацию в файле свойств. Для задания способа вывода сообщений необходимо для вашего логгера указать какие хендлеры он будет использовать. Существует следующие классы хендлеров: FileHandler, ConsoleHandler, StreamHandler, SocketHandler, MemoryHandler. Особенностью JUL является то, что настройки хендлеров задаются в целом для всего класса, а не для конкретного экземпляра, что может порождать не мало проблем, например если вам потребуется сообщения различных логгеров выводить в различные файлы или с различным форматированием. Рассмотрим простой пример конфигурационного файла:

Читать еще:  Случайные ошибки измерения подчинены нормальному закону

Для того что бы JUL применил данную конфигурацию нужно передать параметр -Djava.util.logging.config.file = , либо при старте приложения выполнить код:

Log4j

Данный фреймворк на текущий момент имеет уже вторую версию, которая увы не совместима с первой. Поскольку первая версия log4j существует достаточно давно и, в виду ее большой популярности, существует не мало статей на просторах интернета, сегодня мы рассмотрим вторую. Для использования log4j2 вам необходимо подключить библиотеки log4j-api-2.x и log4j-core-2.x. Log4j имеет несколько отличное от JUL именование уровней логгирования: TRACE, DEBUG, INFO, WARN, ERROR, FATAL, а так же ALL и OFF включающий и отключающий все уровни соответственно.
Логгер создается вызовом статического метода класса org.apache.logging.log4j.Logger:

Логгер умеет принимать помимо привычных нам String, Object и Throwable еще два новых типа — MapMessage и Marker:

В классическом для логгеров стиле методы делятся на два типа: совпадающие с названием уровня логгирования и методы log, принимающие уровень логгирования в качестве параметра. Первые имеют вид:

Методы log в log4j2 выглядят так:

Если не определить конфигурацию, то при запуске log4j2 выдаст гневное сообщение, о том, что конфигурация не задана и будет печатать ваши сообщения на консоль уровнем не ниже ERROR. Конфигурация log4j2 задается несколькими вариантами: xml, json, yaml. Стоит отметить, что со второй версии нет поддержки конфигурации из property файла. Файл с конфигурацией автоматически ищется classpath, должен иметь название log4j2 и располагаться в пакете по умолчанию.
Конфигурация log4j2 состоит из описания логгеров, аппендеров и фильтров. Для более детального изучения обратитесь к документации, сейчас же лишь отметим пару ключевых моментов. Во-первых, есть различные вкусности в виде фильтров, в том числе и по маркерам:

  • BurstFilter
  • CompositeFilter
  • DynamicThresholdFilter
  • MapFilter
  • MarkerFilter
  • RegexFilter
  • StructuredDataFilter
  • ThreadContextMapFilter
  • ThresholdFilter
  • TimeFilter

Во-вторых, имеется широкий круг классов аппендеров, в том числе асинхронные аппендеры и аппендеры оборачивающие группу других аппендеров:

  • AsyncAppender
  • ConsoleAppender
  • FailoverAppender
  • FileAppender
  • FlumeAppender
  • JDBCAppender
  • JMSAppender
  • JPAAppender
  • MemoryMappedFileAppender
  • NoSQLAppender
  • OutputStreamAppender
  • RandomAccessFileAppender
  • RewriteAppender
  • RollingFileAppender
  • RollingRandomAccessFileAppender
  • RoutingAppender
  • SMTPAppender
  • SocketAppender
  • SyslogAppender

Стоит также заметить, что log4j может создавать множество различающихся аппендеров одного и того же класса, например несколько файловых аппендеров, которые пишут в разные файлы.
Рассмотрим пример конфигурации, в которой объявлены два логгера (корневой и для нашего класса), первый из которых пишет в файл log.log, а второй пишет в log2.log с использованием фильтрации по маркеру:

Commons-logging

Довольно старый проект, который представляет собой обертку над JUL и log4j, не привносящая никакого дополнительного функционала. Уровни логгирования у JCL совпадают с log4j, а в случае взаимодействия с JUL происходит следующее сопоставление:

Для использования JCL подключаем commons-logging-1.x.jar. Создаем логгер вызовом метода фабрики:

Методы JCL очень простые, совпадают с названием уровней логгирования, принимают только объекты и исключения и имеют две вариации:

Конфигурация JCL содержит отдельные блоки для log4j, JUL и собственной реализации. Если не задать конфигурацию, то используется собственная реализация, именуемая SimpleLog, которая выводит сообщения на консоль. Рассмотрим пример конфигурационного файла:

Указать файл конфигурации JCL можно следующим образом:

Logback

Данный фреймворк используется только в связке с оберткой SLF4J, которую мы будем рассматривать позднее. Для начала работы вам необходимы logback-core-1.x.jar и logback-classic-1.x.x.jar, а также slf4j-api-1.x.x.jar.
Взаимодействие с логгером мы будем осуществлять через API предоставляемый оберткой SLF4J. Уровни логгирования совпадают с log4j. Создание логгера в таком случае выглядит следующим образом:

API позволяет выводить строковые сообщения, шаблоны строковых сообщений, исключения, а также использовать маркеры:

Названия методов совпадают с уровнями логгирования и имеют вид:

Теперь рассмотрим непосредственны функционал logback. Конфигурация ищется в classpath в следующем порядке:

  1. Пытается найти logback.groovy
  2. Иначе пытается найти logback-test.xml
  3. Иначе пытается найти logback.xml
  4. Иначе использует базовую конфигурацию — выводим сообщения на консоль

Основными элементами конфигурации являются логгеры, аппендеры, лайауты, и фильтры.
Имеются следующие фильтры:

  • Regular filters
  • LevelFilter
  • ThresholdFilter
  • EvaluatorFilter
  • Matchers
  • TurboFilters
  • CountingFilter

Имеются следующие аппендеры:

  • OutputStreamAppender
  • ConsoleAppender
  • FileAppender
  • RollingFileAppender
  • SocketAppender and SSLSocketAppender
  • ServerSocketAppender and SSLServerSocketAppender
  • SMTPAppender
  • SyslogAppender
  • SiftingAppender
  • AsyncAppender

О том что такое Layouts и Encoders в logback предлагаю прочитать подробно в документации, а сейчас лишь приведу простой пример файла logback.xml:

SLF4J

Как уже говорилось ранее SLF4J является оберткой над logback, а также над JUL, log4j, или JCL, а также над любым логгером, который реализует ее интерфейс. Для работы с SLF4J нужны библиотека slf4j-api-1.x.x.jar и реализация одного из логгеров либо заглушка. Как правило реализации всех логгеров ( кроме logback) поставляются вместе с SLF4J и имеют названия на подобии slf4j-jcl-1.x.jar, slf4j-log4j12-1.x.jar, slf4j-nop-1.x.jar и т.п. Если в classpath не будет найдена реализация логгера ( или заглушка nop) SLF4J гневно ругнется и работать откажется. Конфигурация соответственно будет искаться в зависимости от положенной в classpath реализации.
API SLF4J мы рассмотрели в предыдущем пункте, поэтому давайте рассмотрим еще одну возможность обертки. В идеальном мире мы должны выводить сообщения через интерфейс обертки, и тогда у нас все будет хорошо, но реальный жестокий мир говорит о том, что всем нам приходится взаимодействовать со сторонними библиотеками или кодом, в которых используются другие логгеры и которые знать не знают о SLF4J. Что бы не подстраиваться под каждый логгер, а пустить все сообщения через одну реализацию интерфейса SLF4J, можно использовать bridging. В поставке обертки содержаться библиотеки jcl-over-slf4j.jar, log4j-over-slf4j.jar и jul-to-slf4j.jar, которые переопределяют поведение соответствующих логгеров и перенаправляют сообщения в обертку.
Что бы стало понятнее выше сказанное, рассмотрим пример. Допустим у нас имеются следующие логгеры:

Мы хотим, что бы сообщение от JUL записывались в один файл, от log4j в другой, а от slf4j выводились на консоль. В качестве реализации обертки будем использовать logback, конфигурация сего безобразия будет выглядеть следующим образом:

Для того, что бы мост заработал необходимо выполнить код:

Logger log () метод в Java с примерами

Метод log () Logger используется для регистрации сообщения. Если регистратор в настоящее время включен для данного уровня сообщения, который передается в качестве параметра, то создается соответствующий LogRecord и пересылается всем зарегистрированным объектам обработчика вывода. Но в классе logger существует семь различных методов log () в зависимости от параметров, передаваемых в метод.

  1. log (Level level, String msg) : этот метод используется для регистрации сообщения без аргументов. только сообщение будет записано в выходной файл журнала.
    Синтаксис:
Читать еще:  Переменная среды path java

Параметры: Этот метод принимает два параметра уровня, который является одним из идентификаторов уровня сообщения, например, SEVERE и msg, который является строковым сообщением (или ключом в каталоге сообщений).

Возвращаемое значение: этот метод ничего не возвращает

Программа 1: Журнал методов (уровень уровня, строка сообщений)

// Java-программа для демонстрации
// Logger.log (Level level, String msg) метод

public class GFG <

public static void main(String[] args)

GFG. class .getName());

// регистрируем сообщения, используя log (Level level, String msg)

logger.log(Level.INFO, «This is message 1» );

logger.log(Level.WARNING, «This is message 2» );

Выход

log (Level level, String msg, Object param1) : Этот метод используется для регистрации сообщения с одним параметром объекта.

Синтаксис:

Параметры: Этот метод принимает три параметра уровня, который является одним из идентификаторов уровня сообщения, например, SEVERE, msg, который является строковым сообщением (или ключом в каталоге сообщений), и param1, который является параметром для сообщения.

Возвращаемое значение: этот метод ничего не возвращает

Программа 2: Журнал методов (Уровень уровня, Строка msg, Объект param1)

// Java-программа для демонстрации
// Logger.log (Уровень уровня, Строка msg, Объект param1)

public class GFG <

public static void main(String[] args)

GFG. class .getName());

// регистрируем сообщения используя

// log (Уровень уровня, Строка msg, Объект param1)

logger.log(Level.INFO, «logging: <0>» , «message1» );

logger.log(Level.SEVERE, «logging: <0>» , «message2» );

Выход:

log (Level level, String msg, Object [] params) : этот метод используется для регистрации сообщения с массивом аргументов объекта.

Синтаксис:

Параметры: Этот метод принимает три параметра уровня, который является одним из идентификаторов уровня сообщения, например, SEVERE, msg, который является строковым сообщением (или ключом в каталоге сообщений), и param1, который является массивом параметров сообщения.

Возвращаемое значение: этот метод ничего не возвращает

Программа 3: Журнал методов (уровень уровня, строковое сообщение, объект [] param1)

// Java-программа для демонстрации
// Logger.log (Level level, String msg, Object [] param1)

public class GFG <

public static void main(String[] args)

GFG. class .getName());

// регистрируем сообщения используя

// log (Уровень уровня, Строка msg, Object [] param1)

Выход:

log (уровень уровня, строковое сообщение, Throwable Thrown ) : этот метод используется для регистрации сообщения со связанной информацией Throwable.

Синтаксис:

Параметры: Этот метод принимает три параметра уровня, который является одним из идентификаторов уровня сообщения, например, SEVERE, msg, который является строковым сообщением (или ключом в каталоге сообщений), и брошенный, который является Throwable, связанным с сообщением журнала.

Возвращаемое значение: этот метод ничего не возвращает

Программа 4: Журнал методов (уровень уровня, строковое сообщение, выброшенный бросок)

// Java-программа для демонстрации
// Logger.log (уровень уровня, строковое сообщение, бросаемый бросок)

public class GFG <

public static void main(String[] args)

GFG. class .getName());

// регистрируем сообщения используя

// log (уровень уровня, строковое сообщение, бросаемый бросок)

new RuntimeException( «Error» ));

new Exception( «Exception» ));

Выход:

log (уровень уровня, Throwable брошенный, поставщик msgSupplier) : этот метод используется для регистрации ленивого сообщения с соответствующей информацией Throwable. Сообщение и данный Throwable затем сохраняются в LogRecord, который пересылается всем зарегистрированным обработчикам вывода.

Синтаксис:

Параметры: Этот метод принимает три уровня параметров , который является одним из идентификаторов уровня сообщения, например, Серьёзный, брошенный который является Throwable , связанный с сообщениями журнала и msgSupplier , который является функцией, которая при вызове, производит желаемое сообщение журнала.

Возвращаемое значение: этот метод ничего не возвращает

Программа 5: Журнал методов (Уровень уровня, Брошенный бросок, Поставщик msgSupplier)

// Java-программа для демонстрации
// Logger.log (Уровень уровня, Брошенный выброс, Поставщик msgSupplier)

public class GFG <

public static void main(String[] args)

GFG. class .getName());

// Создать метод поставщика

= () -> new String( «Logger logs» );

// регистрируем сообщения используя

// log (Уровень уровня, Throwable бросил, поставщик msgSupplier)

new RuntimeException( «Error» ),

Выход:

log (уровень уровня, поставщик msgSupplier) : этот метод используется для регистрации сообщения, которое должно быть построено только в том случае, если уровень ведения журнала таков, что сообщение будет фактически зарегистрировано.

Синтаксис:

Параметры: Этот метод принимает два параметра уровня, который является одним из идентификаторов уровня сообщения, например, SEVERE и msgSupplier, который является функцией, которая при вызове создает желаемое сообщение журнала.

Возвращаемое значение: этот метод ничего не возвращает

Программа 6: Журнал методов (уровень уровня, поставщик msgSupplier)

// Java-программа для демонстрации
// Logger.log (Level level, msgSupplier)

public class GFG <

public static void main(String[] args)

GFG. class .getName());

// Создать метод поставщика

= () -> new String( «Logger messages» );

// регистрируем сообщения используя

// log (уровень уровня, поставщик msgSupplier)

Выход:

log (LogRecord record) : этот метод используется для регистрации LogRecord. Используя logRecord, мы записываем информацию на выходы регистратора.

Синтаксис:

Параметры: Этот метод принимает одну запись параметра, которая является LogRecord для публикации.

Возвращаемое значение: этот метод ничего не возвращает

Программа 7: Журнал методов (запись LogRecord)

Introduction to Java Logging

Last modified: November 4, 2018

I just announced the new Learn Spring course, focused on the fundamentals of Spring 5 and Spring Boot 2:

In the 9 years of running Baeldung, I’ve never, ever done a «sale».
But. we’ve also not been through anything like this pandemic either.
And, if making my courses more affordable for a while is going to help a company stay in business, or a developer land a new job, make rent or be able to provide for their family — then it’s well worth doing.
Effective immediately, all Baeldung courses are 33% off their normal prices!
You’ll find all three courses in the menu, above, or here.

1. Overview

Logging is a powerful aid for understanding and debugging program’s run-time behavior. Logs capture and persist the important data and make it available for analysis at any point in time.

This article discusses the most popular java logging frameworks, Log4j 2 and Logback, along with their predecessor Log4j, and briefly touches upon SLF4J, a logging facade that provides a common interface for different logging frameworks.

2. Enabling Logging

All the logging frameworks discussed in the article share the notion of loggers, appenders and layouts. Enabling logging inside the project follows three common steps:

  1. Adding needed libraries
  2. Configuration
  3. Placing log statements
Читать еще:  Java net unknownhostexception

The upcoming sections discuss the steps for each framework individually.

3. Log4j 2

Log4j 2 is new and improved version of the Log4j logging framework. The most compelling improvement is the possibility of asynchronous logging. Log4j 2 requires the following libraries:

Latest version of log4j-api you can find here and log4j-core – here.

3.1. Configuration

Configuring Log4j 2 is based on the main configuration log4j.xml file. The first thing to configure is the appender.

These determine where the log message will be routed. Destination can be a console, a file, socket, etc.

Log4j 2 has many appenders for different purposes, you can find more information on the official Log4j 2 site.

Lets take a look at a simple config example:

You can set a name for each appender, for example use name console instead of stdout.

Notice the PatternLayout element – this determines how message should look like. In our example, the pattern is set based on the pattern param, where %d determines date pattern, %p – output of log level, %m – output of logged message and %n – adds new line symbol. More info about pattern you can find on official Log4j 2 page.

Finally – to enable an appender (or multiple) you need to add it to section:

3.2. Logging to File

Sometimes you will need to use logging to a file, so we will add fout logger to our configuration:

The File appender have several parameters that can be configured:

  • file – determines file name of the log file
  • append – The default value for this param is true, meaning that by default a File appender will append to an existing file and not truncate it.
  • PatternLayout that was described in previous example.

In order to enable File appender you need to add it to section:

3.3. Asynchronous Logging

If you want to make your Log4j 2 asynchronous you need to add LMAX disruptor library to your pom.xml. LMAX disruptor is a lock-free inter-thread communication library.

Adding disruptor to pom.xml:

Latest version of disruptor can be found here.

If you want to use LMAX disruptor you need to use instead of in your configuration.

Or you can enable asynchronous logging by setting the system property Log4jContextSelector to org.apache.logging.log4j.core.async.AsyncLoggerContextSelector.

You can of course read more about the configuration of the Log4j2 async logger and see some performance diagrams on the Log4j2 official page .

3.4. Usage

The following is a simple example that demonstrates the use of Log4j for logging:

After running, the application will log the following messages to both console and file named baeldung.log:

If you elevate the root log level to ERROR:

The output will look like the following:

As you can see, changing the log level to upper parameter causes the messages with lower log levels will not be print to appenders.

Method logger.error can be also used to log an exception that occurred:

3.5. Package Level Configuration

Let’s say you need to show messages with the log level TRACE – for example from a specific package such as com.baeldung.log4j2:

For all other packages you want to continue logging only INFO messages.

Keep in mind that TRACE is lower than the root log level INFO that we specified in configuration.

To enable logging only for one of packages you need to add the following section before to your log4j.xml:

It will enable logging for com.baeldung.log4j package and your output will look like:

4. Logback

Logback is meant to be an improved version of Log4j, developed by the same developer who made Log4j.

Logback also has a lot more features compared to Log4j, with many of them being introduced into Log4j 2 as well. Here’s a quick look at all of the advantages of Logback on the official site.

Let’s start by adding the following dependency to the pom.xml:

This dependency will transitively pull in another two dependencies, the logback-core and slf4j-api. Note that the latest version of Logback can be found here.

4.1. Configuration

Let’s now have a look at a Logback configuration example:

Logback uses SLF4J as an interface, so you need to import SLF4J’s Logger and LoggerFactory.

4.2. SLF4J

SLF4J provides a common interface and abstraction for most of the Java logging frameworks. It acts as a facade and provides standardized API for accessing the underlying features of the logging framework.

Logback uses SLF4J as native API for its functionality. Following is the example using Logback logging:

The output will remain the same as in previous examples.

5. Log4J

Finally, let’s have a look at the venerable Log4j logging framework.

At this point it’s of course outdated, but worth discussing as it lays the foundation for its more modern successors.

Many of the configuration details match those discussed in Log4j 2 section.

5.1. Configuration

First of all you need to add Log4j library to your projects pom.xml:

Here you should be able to find latest version of Log4j.

Lets take a look at a complete example of simple Log4j configuration with only one console appender:

is open tag of whole configuration which has one property – debug. It determines whether you want to add Log4j debug information to logs.

5.2. Usage

After you have added Log4j library and configuration you can use logger in your code. Lets take a look at a simple example:

6. Conclusion

This article shows very simple examples of how you can use different logging framework such as Log4j, Log4j2 and Logback. It covers simple configuration examples for all of the mentioned frameworks.

The examples that accompany the article can be found over on GitHub.

Ссылка на основную публикацию
Adblock
detector