1
1
Fork 0
java-interview/log.md

113 lines
9.7 KiB
Markdown
Raw Normal View History

2017-10-21 06:14:08 +03:00
[Вопросы для собеседования](README.md)
2017-05-07 07:05:47 +03:00
2017-10-21 06:01:09 +03:00
# Журналирование
2017-05-07 07:05:47 +03:00
+ [Какие существуют типы логов?](#Какие-существуют-типы-логов)
+ [Из каких частей состоит система журналирования log4j?](#Из-каких-частей-состоит-система-журналирования-log4j)
+ [Что такое _Logger_ в log4j?](#Что-такое-logger-в-log4j)
+ [Что такое _Appender_ в log4j?](#Что-такое-appender-в-log4j)
+ [Что такое _Layout_ в log4j?](#Что-такое-layout-в-log4j)
+ [Перечислите уровни журналирования в log4j? Назовите порядок их приоритетности.](#Перечислите-уровни-журналирования-в-log4j-Назовите-порядок-их-приоритетности)
+ [Какие существуют способы конфигурирования log4j?](#Какие-существуют-способы-конфигурирования-log4j)
2017-10-21 06:01:09 +03:00
## Какие существуют типы логов?
2017-05-07 07:05:47 +03:00
+ системы (System);
+ безопасности (Security);
+ приложения (Application, Buisness).
> Пользователь входит в приложение, проверяется пароль. Это действие относится к безопасности (Security). Дальше он запускает какой-нибудь модуль. Это событие уровня приложения (Application). Модуль при старте обращается к другому модулю за какими-то дополнительными данными, производит какие-либо еще вызовы это уже системные действия (System).
[к оглавлению](#Журналирование)
2017-10-21 06:01:09 +03:00
## Из каких частей состоит система журналирования log4j?
2017-05-07 07:05:47 +03:00
Система журналирования состоит из трёх основных частей:
+ управляющей журналированием - __logger__;
+ добавляющей в журнал - __appender__;
+ определяющей формат добавления - __layout__.
[к оглавлению](#Журналирование)
2017-10-21 06:01:09 +03:00
## Что такое _Logger_ в log4j?
2017-05-07 07:05:47 +03:00
__Logger__ представляет собой объект класса `org.apache.log4j.Logger`, который используется как управляющий интерфейс для журналирования сообщений с возможностью задавать уровень детализации. Именно logger проверяет нужно ли обрабатывать сообщение и если журналирование необходимо, то сообщение передаётся в appender, если нет - система завершает обработку данного сообщения.
[к оглавлению](#Журналирование)
2017-10-21 06:01:09 +03:00
## Что такое _Appender_ в log4j?
2017-05-07 07:05:47 +03:00
__Appender__ - это именованный объект журнала событий, реализующий интерфейс `org.apache.log4j.Appender` и добавляющий события в журнал. Appender вызывает разные вспомогательные инструменты - компоновщик, фильтр, обработчик ошибок (если они определены и необходимы). В ходе этой работы окончательно устанавливается необходимость записи сообщения, сообщению придаются окончательные содержание и форма.
В log4j журнал может представлять:
+ консоль;
+ файл;
+ сокет;
+ объект класса реализующего `java.io.Writer` или `java.io.OutputStream`;
+ JDBC хранилище;
+ тему (topic) JMS;
+ NT Event Log;
+ SMTP;
+ Syslog;
+ Telnet.
Наиболее часто используемые log4j appender-ы:
+ `org.apache.log4j.ConsoleAppender` - вывод в консоль;
+ `org.apache.log4j.FileAppender` - добавление в файл;
+ `org.apache.log4j.DailyRollingFileAppender` - добавление в файл с обновлением файла через заданный промежуток времени;
+ `org.apache.log4j.RollingFileAppender` - добавление в файл с обновлением файла по достижению определенного размера;
+ `org.apache.log4j.varia.ExternallyRolledFileAppender` - расширение _RollingFileAppender_ обновляющее файл по команде принятой с заданного порта;
+ `org.apache.log4j.net.SMTPAppender` - сообщение по SMTP;
+ `org.apache.log4j.AsyncAppender` - позволяет, используя отдельный поток, организовать асинхронную работу, когда сообщения фиксируются лишь при достижении определенного уровня заполненности промежуточного буфера.
+ `org.apache.log4j.nt.NTEventLogAppender` - добавление в NT Event Log;
+ `org.apache.log4j.net.SyslogAppender` - добавление в Syslog;
+ `org.apache.log4j.jdbc.JDBCAppender` - запись в хранилище JDBC;
+ `org.apache.log4j.lf5.LF5Appender` - сообщение передаётся в специальный GUI интерфейс LogFactor5
+ `org.apache.log4j.net.SocketAppender` - трансляция сообщения по указанному адресу и порту;
2021-02-05 18:07:43 +03:00
+ `org.apache.log4j.net.SocketHubAppender` - рассылка сообщения сразу нескольким удалённым серверам, соединённым по заданному порту;
2017-05-07 07:05:47 +03:00
+ `org.apache.log4j.net.TelnetAppender` - отсылка сообщения по протоколу Telenet;
+ `org.apache.log4j.net.JMSAppender` - добавление сообщения в JMS.
[к оглавлению](#Журналирование)
2017-10-21 06:01:09 +03:00
## Что такое _Layout_ в log4j?
2017-05-07 07:05:47 +03:00
__Layout__ - наследник класса `org.apache.log4j.Layout` предоставляющий возможность форматирования сообщения перед добавлением в журнал.
В log4j существуют следующие типы layout-ов:
+ `org.apache.log4j.SimpleLayout` - на выходе получается строка содержащая лишь уровень вывода и сообщение;
+ `org.apache.log4j.HTMLLayout` - форматирует сообщение в виде элемента HTML-таблицы;
2021-02-05 18:07:43 +03:00
+ `org.apache.log4j.xml.XMLLayout` - компонует сообщение в виде XML формате;
2017-05-07 07:05:47 +03:00
+ `org.apache.log4j.TTCCLayout` - на выходе сообщение дополняется информацией о времени, потоке, имени логгера и вложенном диагностическом контексте;
+ `org.apache.log4j.PatternLayout` / `org.apache.log4j.EnhancedPatternLayout` - настройка форматирования сообщения при помощи шаблона заданного пользователем.
[к оглавлению](#Журналирование)
2017-10-21 06:01:09 +03:00
## Перечислите уровни журналирования в log4j? Назовите порядок их приоритетности.
2017-05-07 07:05:47 +03:00
+ __OFF__ - отсутствие журналирования;
+ __FATAL__ - фатальная ошибка;
+ __ERROR__ - ошибка;
+ __WARN__ - предупреждение;
+ __INFO__ - информация;
+ __DEBUG__ - детальная информация для отладки;
+ __TRACE__ трассировка всех сообщений.
Между уровнями логирования установлен следующий порядок приоритетов:
2021-01-17 22:54:31 +03:00
`ALL < TRACE < DEBUG < INFO < WARN < ERROR < FATAL < OFF`
2017-05-07 07:05:47 +03:00
[к оглавлению](#Журналирование)
2017-10-21 06:01:09 +03:00
## Какие существуют способы конфигурирования log4j?
2017-05-07 07:05:47 +03:00
Для того, чтобы log4j начал работать нужно предоставить ему конфигурацию. Это можно сделать несколькими путями:
+ Создать конфигурацию программно, т.е. получить logger, определить уровень журналирования, прикрепить appender и задать способ форматирования.
+ Указать файл или URL как аргумент при запуске java-машины `-Dlog4j.configuration=путь/к/файлу/конфигурации`, а затем прочитать его в программе при помощи `PropertyConfigurator.configure(...)`/ `DOMConfigurator.configure(...)` для формата `.properties` или `XML` соответственно.
+ Загрузить конфигурацию из файла в формате `XML` или `.properties`: log4j ищет файл конфигурации в classpath. Сначала ищется файл `log4j.xml` и, если таковой не найден, - файл `log4j.properties`.
[к оглавлению](#Журналирование)
2017-10-21 06:14:08 +03:00
# Источники
2017-05-07 07:05:47 +03:00
+ [Quizful](http://www.quizful.net/)
2017-10-21 06:01:09 +03:00
+ [Skipy](http://skipy.ru/useful/logging.html#log4j_concepts_logger)
2017-10-21 06:14:08 +03:00
[Вопросы для собеседования](README.md)