1
1
Fork 0
java-interview/log.md

111 lines
9.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

[Вопросы для собеседования на Java Junior](README.md)
# Журналирование
+ [Какие существуют типы логов?](#Какие-существуют-типы-логов)
+ [Из каких частей состоит система журналирования log4j?](#Из-каких-частей-состоит-система-журналирования-log4j)
+ [Что такое _Logger_ в log4j?](#Что-такое-logger-в-log4j)
+ [Что такое _Appender_ в log4j?](#Что-такое-appender-в-log4j)
+ [Что такое _Layout_ в log4j?](#Что-такое-layout-в-log4j)
+ [Перечислите уровни журналирования в log4j? Назовите порядок их приоритетности.](#Перечислите-уровни-журналирования-в-log4j-Назовите-порядок-их-приоритетности)
+ [Какие существуют способы конфигурирования log4j?](#Какие-существуют-способы-конфигурирования-log4j)
## Какие существуют типы логов?
+ системы (System);
+ безопасности (Security);
+ приложения (Application, Buisness).
> Пользователь входит в приложение, проверяется пароль. Это действие относится к безопасности (Security). Дальше он запускает какой-нибудь модуль. Это событие уровня приложения (Application). Модуль при старте обращается к другому модулю за какими-то дополнительными данными, производит какие-либо еще вызовы это уже системные действия (System).
[к оглавлению](#Журналирование)
## Из каких частей состоит система журналирования log4j?
Система журналирования состоит из трёх основных частей:
+ управляющей журналированием - __logger__;
+ добавляющей в журнал - __appender__;
+ определяющей формат добавления - __layout__.
[к оглавлению](#Журналирование)
## Что такое _Logger_ в log4j?
__Logger__ представляет собой объект класса `org.apache.log4j.Logger`, который используется как управляющий интерфейс для журналирования сообщений с возможностью задавать уровень детализации. Именно logger проверяет нужно ли обрабатывать сообщение и если журналирование необходимо, то сообщение передаётся в appender, если нет - система завершает обработку данного сообщения.
[к оглавлению](#Журналирование)
## Что такое _Appender_ в log4j?
__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` - трансляция сообщения по указанному адресу и порту;
+ `org.apache.log4j.net.SocketHubAppender` - рассылка сообщения сразу нескольким удалённым серверам соединённым по заданному порту;
+ `org.apache.log4j.net.TelnetAppender` - отсылка сообщения по протоколу Telenet;
+ `org.apache.log4j.net.JMSAppender` - добавление сообщения в JMS.
[к оглавлению](#Журналирование)
## Что такое _Layout_ в log4j?
__Layout__ - наследник класса `org.apache.log4j.Layout` предоставляющий возможность форматирования сообщения перед добавлением в журнал.
В log4j существуют следующие типы layout-ов:
+ `org.apache.log4j.SimpleLayout` - на выходе получается строка содержащая лишь уровень вывода и сообщение;
+ `org.apache.log4j.HTMLLayout` - форматирует сообщение в виде элемента HTML-таблицы;
+ `org.apache.log4j.xml.XMLLayout` - компанует сообщение в виде XML формате;
+ `org.apache.log4j.TTCCLayout` - на выходе сообщение дополняется информацией о времени, потоке, имени логгера и вложенном диагностическом контексте;
+ `org.apache.log4j.PatternLayout` / `org.apache.log4j.EnhancedPatternLayout` - настройка форматирования сообщения при помощи шаблона заданного пользователем.
[к оглавлению](#Журналирование)
## Перечислите уровни журналирования в log4j? Назовите порядок их приоритетности.
+ __OFF__ - отсутствие журналирования;
+ __FATAL__ - фатальная ошибка;
+ __ERROR__ - ошибка;
+ __WARN__ - предупреждение;
+ __INFO__ - информация;
+ __DEBUG__ - детальная информация для отладки;
+ __TRACE__ трассировка всех сообщений.
Между уровнями логирования установлен следующий порядок приоритетов:
`OFF < TRACE < DEBUG < INFO < WARN < ERROR < FATAL < ALL`
[к оглавлению](#Журналирование)
## Какие существуют способы конфигурирования log4j?
Для того, чтобы log4j начал работать нужно предоставить ему конфигурацию. Это можно сделать несколькими путями:
+ Создать конфигурацию программно, т.е. получить logger, определить уровень журналирования, прикрепить appender и задать способ форматирования.
+ Указать файл или URL как аргумент при запуске java-машины `-Dlog4j.configuration=путь/к/файлу/конфигурации`, а затем прочитать его в программе при помощи `PropertyConfigurator.configure(...)`/ `DOMConfigurator.configure(...)` для формата `.properties` или `XML` соответственно.
+ Загрузить конфигурацию из файла в формате `XML` или `.properties`: log4j ищет файл конфигурации в classpath. Сначала ищется файл `log4j.xml` и, если таковой не найден, - файл `log4j.properties`.
[к оглавлению](#Журналирование)
##Источники
+ [Quizful](http://www.quizful.net/)
+ [Skipy](http://skipy.ru/useful/logging.html#log4j_concepts_logger)