Заметки разработчика
узнал сам – поделись с другими
26 октября 2012 г.
Простое логирование при помощи Log4j
В большинстве информационных систем среди уровней логирования выделяют следующие (от более низкого к более высокому):
В качестве примера рассмотрим простое приложение, состоящее всего из одного класса и одного конфигурационного файла. Если вы разрабатываете в Idea, то вот вам пошаговая инструкция:
Создайте в папке src вашего проекта какой-нибудь пакет (например, ru.nordmine), а в нём создайте класс SimpleMain с таким содержимым:
public class SimpleMain <
private static final Logger logger = Logger.getLogger(SimpleMain.class);
public static void main(String[] args) <
for(int i = 0; i try <
logger.info(«result: » + divide(i));
> catch (Exception e) <
logger.error(e.getMessage(), e);
>
>
>
public static int divide(int x) <
logger.debug(«divide method invoked; 2 / » + x);
if(x == 0) <
logger.warn(«x = 0; exception may occur»);
>
return 2 / x;
>
>
В классе SimpleMain логгер определён в виде приватного статического и неизменяемого поля. В качестве параметра метода, который его создаёт, передаём текущий класс. В самом методе main в цикле вызывается метод divide, который выполняет какую-то работу. Неважно какую, в качестве примера он делит 2 на то число, которое ему передали. Обратите внимание на уровни логирования.
В методе divide при старте выводится сообщение уровня debug о том, что метод запущен и с каким параметром. Предположим, что мы используем уровень логирования INFO, поэтому данное сообщение будет выводится не будет. И зачем, ведь нам не интересно знать о каждом выводе метода и с каким параметром.
Далее, поскольку метод делит 2 на то, что к нему пришло, есть некая вероятность деления на нуль (что и прозойдёт в нашем примере). Поэтому лучше проверять входные аргументы и выводить предупреждение, если что-то будет не так. Уровень WARN выше, чем INFO, поэтому при текущем уровне логирования предупреждение будет выведено.
В методе main в цикле мы вызываем метод divide, передавая ему последовательно аргументы от 0 до 2. Зная, что в вызываемом методе потенциально может возникнуть ошибка, обернём его вызов в конструкцию try-catch. Обратите внимание, что она внутри цикла, а не снаружи. То есть ошибочный аргумент метода не остановит весь цикл, а только одну итерацию, что логично. Если вызов пройдёт успешно, будет показан результат с уровнем INFO, если произойдёт исключение, то будет выведен текст ошибки с уровнем ERROR и полный stack trace, ведь мы передаём логгеру не только текст ошибки, но и объект исключения. И это правильно, т.к. среди однотипных записей лога гораздо быстрее обнаружить stack trace, чем неприметную запись ERROR.
Теперь осталось сконфигурировать логгер. Его конфигурация может быть в двух форматах: обычном текстовом property-файле (log4j.properties) и в формате xml (log4j.xml). Начнём с более простого текстового. Положите файл log4j.properties со следующим содержимым в корень вашего проекта:
# Root logger option
log4j.rootLogger=INFO, stdout
Это пожалуй самый простой вариант настройки логгирования, при котором сообщения в указанном формате будут выводить только на консоль, причём только если уровень не ниже INFO.
А теперь давайте сконфигурируем логгер таким образом, чтобы сообщения выводились в консоль и в файл. Поместим эту конфигурацию в файл log4j.xml, который положим в корень папки src.
В этой конфигурации мы отключаем вывод отладочной информации самого логгера (иногда это тоже может пригодиться). Для добавления записи в лог используется так называемый аппендер. В библиотеке определено множество различных типов аппендеров, мы же здесь рассмотрим два из них: ConsoleAppender (вывод в консоль) и DailyRollingFileAppender (запись в файл).
Если с консолью всё понятно, то почему был выбран именно DailyRollingFileAppender? Дело в том, что этот тип аппендера позволяет не просто записывать в файл, а ещё и автоматически архивировать эти файлы. Например, создавать каждые сутки новый файл для лога. Имя файла, а заодно и правила ротации, задаёт параметр DatePattern. В нашем примере файлы будут создаваться каждые сутки. Имя файла будет иметь формат «messages-ГГГГ-ММ-ДД». Файл, в который в настоящий момент ведётся запись, имеет имя «messages» (параметр File) без метки времени. Можно настроить ротацию также каждый час и даже каждую минуту. В зависимости от того, как много записей добавляется в лог.
В конце указываем минимальный корневой уровень логирования (INFO) для обоих аппендеров. Записи ниже этого уровня добавляться не будут.
Теперь, если запустить наше приложение, мы увидим только одну строку с уровнем INFO (в файл была добавлена точно такая же строка):
Здесь мы видим, что сначала было предупреждение, а затем произошла ошибка, поэтому понижаем уровень логирования до DEBUG, чтобы получить больше отладочной информации, и тогда мы увидим, какие методы вызывались и с какими параметрами:
Учимся вести логирования с помощью Log4j
Давайте научимся следить за выполнением логики в нашей программе, для этого мы научимся использовать логирование, поймем зачем оно и где используется.
Шаг 0. Обзор
Логирование – не используя термины википедии, то это возможность следить за процесом выполнения бизнес-логики проекта.
Зачем нужно логирование и что оно даёт?
Допустим у вас есть WEB-проект, и он что-то делает, сейчас не важно что именно. Допустим это интернет магазин, на котором при оформлении заказа нужно отправить на почту покупателю отчет о его покупке, но почтовый сервер вышел из строя, и программно письмо не отправилось.
Вы, как человек который администрирует магазин начнет разбераться в чем же проблема. Неопытный человек будет долго искать проблему, а опытный сразу полезет в логи сервера, но там все логи сервера и найти то что нужно вам сложно.
В этом случае решение следующее, выводить нужные вам логи в отдельный файл. Но как понять, какие из всех логов, которые сыпятся в общий лог сервера нужны вам? Для этого нужно реализовать свою систему логирования, где вы сможите указать какие логи куда выводить, или же настроить уровни логирования.
В данном уроке мы рассмотрим как сконфигурировать и начать использовать Log4j.
Шаг 1. Создаем проект и добавляем завимости
Запускаем всеми любимую Intellij IDEA и тыкаем New Project выбираем Maven Module и называем его :
Теперь в pom.xml жлбавим зависимость:
Это все зависимости, которые надо было подключить.
Шаг 2. Создание примитивной логики для примера
Давайте создадим класс в котором была бы бизнес-логика, назовем его OrderLogic:
Хочу обратить ваше внимание на то, что логика данного проекта не важна, так как мы рассматриваем логирование, для этого я и подготовил примитивную логику класса OrderLogic.
И теперь создаем Main класс:
В результате выполнения данного кода, мы получим следующее:
Как видите пока ничего нового.
Шаг 3. Конфигурируем Log4j
Чтобы гибко управлять логированием стоит создать в resources/ файл log4j.properties:
Теперь в этот файл добавим пару строк конфигураций:
Теперь давайте более детальней разберем строку формирования шаблона:
%d – выводит дату в формате 2014-01-14 23:55:57
%-5p – выводит уровень лога (ERROR, DEBUG, INFO …), цифра 5 означает что всегда использовать 5 символов остальное дополнится пробелами, а минус (-), то что позиционирование по левой стороне.
%c – категория, в скобках указывается сколько уровней выдавать. Так как у нас 1 уровень то писаться будет только имя класса.
%L – номер строки в которой произошёл вызов записи в лог.
%m – сообщение, которое передали в лог.
%n – переход на новую строку.
Шаг 4. Добавляем примитивное логирование
Теперь в класс OrderLogic добави логирование и посмотрим на результат:
Set log4j in Intellij IDEA 2019 and configuration of log4j.xml
Prerequisites
1::Download IntelliJ IDEA
2::Make a Hello World project
When you try to import
So how to make this work
Follow these few steps.
Step 1: press (shift+Ctrl+Alt+S)
Open the project structure
Then press the + and then from maven
A window will open paste this line and search the package
Then press ok it will download the package
Here see its working now.
Red part will be explained in the configuration part
Configuration part:
If you don’t do this configuration then log4j will use the default configration
make a file file with name log4j.xml
and paste this in the file
look in the above image the file structure circled.
You can change root level to
Just a slight note: I spent 2 days on searching… Hope this will help the newbies
And please comment below if you find any mistake.
How to Start Logging With Log4j
By Pavel Sheida
Last Validated on May 31 2021 · Originally Published on May 31, 2021 · Viewed 1.1k times
Introduction
The log4j is a logging framework for Java. It supports multiple logging targets, structured output, logging hierarchy, and everything a modern logging framework should support. In the long list of its features, you can find:
Log4j is useful in the simplest small applications as well as in large and complex ones. Due to its rich configuration abilities, you can use it in all your projects.
Also, Log4j has great documentation, a lot of related materials, and a big developer community.
In the tutorial you learn how to:
Prerequisites
For this tutorial you will need:
Step 1 — Creating a Project
To get started, you need to create a new project. To simplify the work, we are going to use a default IntelliJ template for the Console Applications, the Command Line App template.
You can create a Command Line Application Let’s break it down into simple steps, the first thing you need to do is to open the New Project windows. There are several ways how to do it in the IntelliJ IDEA.
The first one is to select Create a new project in the welcome window.
The second one, If the IntelliJ is already open, you can follow the path on the top menu bar File > New > Project.
In the New Project window click on Java, and select the Command Line App template.
Step 2 — Installing Dependencies
Before starting work on the application, you need to install some dependency packages. IntelliJ provides multiple ways to do it. However, in the tutorial we will use Maven — a software project management and comprehension tool. Based on the concept of a project object model.
The dependency management in Java may seem complicated, but we are going to break it down into small steps.
In the window that opens, select the Libraries tab, then press ALT + INSERT and select From Maven.
Now, you can enter a Maven package you’d like to install and press OK. The package will be available from any part of the project!
Step 3 — Creating a Logger
At the moment, you are ready to create a logger. For the application, we are going to use the simplest way to do it in log4j — the LogManager class. It provides the getLogger method to get a unique logger per each class. Unlike the globally configured logger, the logger per class helps you to easily capture the source of the log message.
The getLogger method has many overloads. However, the most useful are the ones accepting string or Class as the only parameter. You can manually specify a class type or a string name for each logger. However, we are going to use the recommended way, the built-in tools to identify the caller class.
The logger will use log4j’s default log levels system. The system consists of the 6 levels:
Step 4 — Creating a Config
Log4j provides 2 ways how to configure the logging system: programmatically or via a configuration file. You can get advanced information about each of them in the documentation.
In the tutorial we’re going to configure the logger using log4j2.xml file.
The first thing to do is to create a log4j2.xml file in the root of your application, in the src folder. You can do it by pressing right-clicking the src tab in the sidebar and clicking the New option. The only thing left is to enter the log4j2.xml name in the opened window.
The log4j2.xml file should look like:
Now, let’s write a config. The config is written in the XML language. If you are not familiar with the XML language, you may dive in the great XML tutorial by w3school.
In our case the config consists of 2 parts: setting up the loggers and setting up the appenders.
We’ve decided to add 3 logging targets for the application: the console and a file. In the config file, each of them will be represented by a separate XML element. Let’s write the appenders in the config file.
The first appender is the console. It will log all data from the loggers.
The second appender is the logs/all.log file. It will write all data from the loggers.
The third appender is the logs/important.log file. It will write all warnings and higher severity logs.
Now, let’s specify the minimum level for the root logger and appenders used by the logger.
Step 5 — Creating Extra Classes
We’re going to use 2 extra classes. To create a new file for a class, you can right-click your package’s folder in the sidebar and click New, then select Java Class.
The first file will contain a Person class. You can see its code in the snippet below.
The second file will contain a Car class. You can see its code in the snippet below.
Step 6 — Logging
To demonstrate how the logger works, we will log some simple messages, at least one of each level. It’s a pretty straightforward task, because of the clear log4j API.
After the execution, your console’s output should look like:
Now, let’s check the logs written in the all.log file.
At the end, let’s check the logs written in the important.log file.
Conclusion
Proper logging can greatly assist in the support and development of your application. This may seem like a daunting task, but log4j is a fast and configurable logging framework that greatly simplifies the task.
In the tutorial, you have configured your logging system with multiple logging targets for a Java console application with log4j.
Now developing and maintaining your Java applications will be much easier!
Логирование в Java – Logger
При создании приложений мы часто сталкиваемся с ошибками, которые необходимо отлаживать. Итак, с помощью логов мы можем легко получить информацию о том, что происходит в приложении, с записью ошибок и необычных обстоятельств. Теперь вам может показаться, что почему бы не использовать оператор System.out.print() в Java.
Проблема с этими утверждениями состоит в том, что сообщения журнала будут печататься только на консоли. Поэтому, как только вы закроете консоль автоматически, все журналы будут потеряны. Они не хранятся постоянно и будут отображаться один за другим, так как это однопоточная среда.
Компоненты
Компоненты ведения журнала помогают разработчику создавать их, передавать в соответствующее место назначения и поддерживать надлежащий формат. Ниже приведены три компонента:
Вы можете обратиться к изображению ниже для работы всех трех компонентов:
Когда приложение выполняет вызов регистрации, компонент Logger записывает событие в LogRecord и перенаправляет его соответствующему Appender. Затем он форматировал запись, используя формат в соответствии с требуемым форматом. Помимо этого, вы также можете использовать более одного фильтра, чтобы указать, какие Appenders следует использовать для событий.
Что такое Логгеры (Logger) в Java?
Логгеры (Logger) в Java – это объекты, которые запускают события журнала. Они создаются и вызываются в коде приложения, где генерируют события журнала перед передачей их следующему компоненту, который является Appender.
Вы можете использовать несколько логгеров в одном классе для ответа на различные события или использовать в иерархии. Они обычно называются с использованием иерархического пространства имен, разделенных точками. Кроме того, все имена Logger должны основываться на классе или имени пакета зарегистрированного компонента.
Кроме того, каждый логгер отслеживает ближайшего существующего предка в пространстве имен, а также имеет связанный с ним «уровень».
Как создать?
Синтаксис
Здесь SampleClass – это имя класса, для которого мы получаем объект Logger.
Уровни
Уровни журналов используются для классификации их по степени серьезности или влиянию на стабильность приложения. Пакет org.apache.log4j.* и java.util.logging предоставляют разные уровни ведения журнала.
Пакет org.apache.log4j.* предоставляет следующие уровни в порядке убывания:
Пакет java.util.logging предоставляет следующие уровни в порядке убывания:
Помимо этого, вышеприведенный пакет также предоставляет два дополнительных уровня ALL и OFF используются для регистрации всех сообщений и отключения регистрации соответственно.
Пример с использованием пакета org.apache.log4j.*
Таким образом, если в нашем файле log4j.properties ваш вывод является корневым логгером уровня WARN, то все сообщения об ошибках с более высоким приоритетом, чем WARN, будут напечатаны, как показано ниже:
Пример с использованием пакета java.util.logging
Файл свойств пакета Log4j и Java Util
Пример файла свойств Log4j
Пример файла свойств пакета Java Util
Регистрация событий
Чтобы регистрировать события в Java, вы должны убедиться, что вы назначаете уровень, чтобы легко отфильтровать события. Чтобы назначить уровень и упомянуть сообщение, вы можете использовать следующие методы:
Способ 1
Способ 2
Чтобы убедиться, что Logger регистрирует только события, которые находятся на уровне или выше уровня INFO, вы можете использовать метод setLevel(), описанный выше.
Appender или Handlers
Appender или Handlers отвечают за запись событий журнала в пункт назначения. Каждый регистратор имеет доступ к нескольким обработчикам и получает сообщение журнала от регистратора. Затем Appenders используют средства форматирования или макеты для форматирования событий и отправки их в соответствующее место назначения.
Appender можно отключить с помощью метода setLevel (Level.OFF). Два наиболее стандартных обработчика в пакете java.util.logging :
Layout или Formatters
Используются для форматирования и преобразования данных в журнале событий. Каркасы журналов предоставляют макеты для HTML, XML, Syslog, JSON, простого текста и других журналов.










