1 © Luxoft Training 2013 Модуль 9 Введение Уровни логирования Хэндлеры Фильтры Иерархия логеров Общий сценарий логирования Конфигурационные файлы 9-1 Система журналирования Java
2 © Luxoft Training 2013Журналирование Очень часто при создании даже небольших программ встает задача журналирования (logging), позволяющая выводить сообщения о ходе работы программы в различные источники (консоль, файл и т.д.) 9-2 Введение
3 © Luxoft Training 2013Журналирование Журналируемая информация может быть полезна: Конечным пользователям и системным администраторам (ошибки конфигурации, проблемы с безопасностью) Разработчикам (отслеживание стека выполнения программы, ошибки, помощь в отладке) 9-3 Введение
4 © Luxoft Training 2013Журналирование Существуют различные фреймворки реализующие задачу журналирования. К ним относятся: Apache log4java Apache Commons Logging SLF4J И др. 9-4 Существующие реализации
5 © Luxoft Training 2013Журналирование Начиная с версии JDK 1.4 Java поддерживает собственную систему журналирования (Java Logging), являющуюся частью платформы. Это имеет ряд плюсов и минусов 9-5 Существующие реализации
6 © Luxoft Training 2013Журналирование Отлаженность, т.к. базируется на уже существовавших фреймворках Легковесна и легка для понимания Является стандартом 9-6 Java Logging. Плюсы
7 © Luxoft Training 2013Журналирование Являясь стандартом платформы Java, новые версии фреймворка выходят редко Т.к Java Logging появился только в JDK 1.4, а log4j использовался и ранее, многие программисты продолжают использовать log4j по привычке 9-7 Java Logging. Минусы
8 © Luxoft Training 2013Журналирование Java logging фреймворк расположен в пакете java.util.logging Объект класс java.util.logging.Logger (логгер) служит для вывода сообщения из системы Каждый логгер имеет произвольное имя. Обычно, имя базируется на имени пакета и класса, для которого журналируется сообщение 9-8 Java Logging. Введение
9 © Luxoft Training 2013Журналирование Получить объект класса java.util.logging.Logger можно с помощью фабричного метода Logger.getLogger("loggerName") 9-9 Получение логгера
10 © Luxoft Training 2013 Модуль 9 Введение Уровни логирования Хэндлеры Фильтры Иерархия логеров Общий сценарий логирования Конфигурационные файлы 9-10 Система журналирования Java
11 © Luxoft Training 2013Журналирование Уровни логирования (log levels) – механизм, позволяющий контролировать, какие сообщения необходимо журналировать Чем выше уровень, тем более важная (критичная) информация должна быть журналирована 9-11 Уровни логирования
12 © Luxoft Training 2013Журналирование 9-12 Уровни логирования
13 © Luxoft Training 2013Журналирование Класс java.util.logging.Level инкапсулирует соответствующие значения уровней логирования Logging API подразумевает расширение, в частности создание собственных уровней логирования 9-13 Уровни логирования
14 © Luxoft Training 2013Журналирование При логировании строкового сообщения, создается объект java.util.logging.LogRecord, инкапсулирующее заданную строку 9-14 Уровни логирования
15 © Luxoft Training 2013Журналирование Класс Logger имеет ряд соответствующих методов, логирующих сообщение и задающих его уровень логирования Т.е. используя соответствующий метод задается «важность» сообщения 9-15 Уровни логирования
16 © Luxoft Training 2013Журналирование Впоследствии (рассмотрим далее) можно гибко управлять выводом сообщений учитывая их уровень логирования: например, при отладке необходимо выводить все сообщения, в production – только сообщения уровней SEVERE, WARNING и INFO 9-16 Уровни логирования
17 © Luxoft Training 2013Журналирование Уровни логирования образуют иерархию, т.е. если система логирования сконфигурирована на вывод сообщения данного уровня, то осуществляется также вывод всех сообщений более верхних (вплоть до SEVERE) уровней 9-17 Уровни логирования
18 © Luxoft Training 2013Журналирование По умолчанию Logging API сконфигурирована на вывод сообщений уровня INFO. Это означает, что будут выводиться сообщения уровней SEVERE, WARNING и INFO 9-18 Уровни логирования
19 © Luxoft Training 2013Журналирование Итак, программист в коде Java приложения: Получает экземпляр логгера по имени Логирует необходимое сообщение, присваивая ему тот или иной уровень логирования с помощью вызова одного из методов logger.severe(), warning(), info(), config(), fine(), finer(), finest() 9-19 Уровни логирования
20 © Luxoft Training 2013Журналирование 9-20 Пример. Что выведет этот код?
21 © Luxoft Training 2013 LoggerConfigTutor Журналирование Пример
22 © Luxoft Training 2013 Модуль 9 Введение Уровни логирования Хэндлеры Фильтры Иерархия логеров Общий сценарий логирования Конфигурационные файлы 9-22 Система журналирования Java
23 © Luxoft Training 2013Журналирование Хэндлер (handler) – механизм, осуществляющий вывод заблокированного сообщения в какой- либо источник (консоль, файл и т.п.) Логгер может иметь один или несколько ассоциированных с ним хендлеров, осуществляющих вывод сообщения в разные источники 9-23 Хэндлеры
24 © Luxoft Training 2013Журналирование Класс java.util.logging.Handler является базовым для всех хендлеров Java Logging API имеет следующие «встроенные» хендлеры: ConsoleHandler FileHander MemoryHandler SocketHandler StreamHandler 9-24 Хэндлеры
25 © Luxoft Training 2013Журналирование Можно реализовывать собственные хендлеры Методы Logger.addHandler(Handler), Logger.removeHandlers(), Logger.getHandlers()[] позволяют добавить, удалить, получить все хендлеры у логгера 9-25 Хэндлеры
26 © Luxoft Training 2013Журналирование ConsoleHandler осуществляет вывод сообщения на консоль FileHandler осуществляет запись в файл. Конструктор принимает имя файла для вывода, а также флаг, указывающий, необходимо ли добавлять в конец лога: file = new FileHandler("file.log", true); 9-26 ConsoleHandler и FileHandler
27 © Luxoft Training 2013Журналирование FileAppender поддерживает т.н. удерживание лога (log retention) – когда размер одного файла достигает некоторого значения, создается следующий файл file = new FileHandler("%t/java%g.log", , 10, true); В примере происходит удержание 10 фалов по 1 мегабайту 9-27 ConsoleHandler и FileHandler
28 © Luxoft Training 2013 Модуль 9 Введение Уровни логирования Хэндлеры Фильтры Иерархия логеров Общий сценарий логирования Конфигурационные файлы 9-28 Система журналирования Java
29 © Luxoft Training 2013Журналирование Фильтр – механизм, позволяющий осуществить проверку того, необходимо ли логировать сообщение Фильтр может назначаться логгеру и/или хендлеру Только 1 фильтр может быть назначен 9-29 Фильтры
30 © Luxoft Training 2013Журналирование Фильтр – интерфейс java.util.logging.Filter, определяющий метод isLoggable(LogRecord record), возвращающий значение boolean. Если оно true, сообщение выводится, в противном случае - игнорируется По умолчанию ни логгер, ни хэндрел не имеют фильтров 9-30 Фильтры
31 © Luxoft Training 2013Журналирование 9-31 Фильтры
32 © Luxoft Training 2013 LoggerLevelTutor Журналирование Фильтры
33 © Luxoft Training 2013 Модуль 9 Введение Уровни логирования Хэндлеры Фильтры Иерархия логеров Общий сценарий логирования Конфигурационные файлы 9-33 Система журналирования Java
34 © Luxoft Training 2013Журналирование Все логеры образуют иерархию. Для каждого логера можно задать родительский логер с помощью Logger.setParent(Logger) Однако, обычно явно родителя не задают. Иерархия основывается на имени логеров 9-34 Иерархия логеров
35 © Luxoft Training 2013Журналирование 9-35 Иерархия логеров
36 © Luxoft Training 2013Журналирование Установка свойств (уровня логирования, хендлеров или фильтров) у родительского логера не распространяется на дочерние логеры Однако, если у данного логера не установлено какое-либо свойство, он осуществляет подъем по иерархии и «наследует» необходимое свойство 9-36 Иерархия логеров
37 © Luxoft Training 2013Журналирование 9-37 Иерархия логеров. Пример
38 © Luxoft Training 2013Журналирование Иерархия логеров. Пример LogHierarchyTutor
39 © Luxoft Training 2013 Модуль 9 Введение Уровни логирования Хэндлеры Фильтры Иерархия логеров Общий сценарий логирования Конфигурационные файлы 9-39 Система журналирования Java
40 © Luxoft Training 2013Журналирование Общий сценарий логирования таков: Данный логер проверяет уровень логирования сообщения относительно своего уровня Если тест пройдет (учитывая иерархию уровней), логер создает LogRecord Если у логера зарегистрирован фильтр, он осуществляет проверку пригодности LogRecord 9-40 Складывая все вместе
41 © Luxoft Training 2013Журналирование Если сообщение прошло проверки, оно передается каждому зарегистрированному хендлеру Каждый хендлер применяет свой собственный уровень логирования и фильтр Затем логер передает сообщение на обработку хендлерам родительских логеров вверх по иерархии 9-41 Складывая все вместе
42 © Luxoft Training 2013Журналирование 9-42 Складывая все вместе
43 © Luxoft Training 2013 Модуль 9 Введение Уровни логирования Хэндлеры Фильтры Иерархия логеров Общий сценарий логирования Конфигурационные файлы 9-43 Система журналирования Java
44 © Luxoft Training 2013Журналирование Многие настройки можно задавать не программно, а с помощью конфигурационного файла. Он указывается с помощью java -Djava.util.logging.config.file= mylogging.properties Main 9-44 Конфигурационные файлы
45 © Luxoft Training 2013Журналирование #Уровень корневого логера.level= INFO java.util.logging.FileHandler.pattern = %h/java%u.log java.util.logging.FileHandler.limit = java.util.logging.FileHandler.count = 1 java.util.logging.FileHandler.formatter = java.util.logging.XMLFormatter java.util.logging.ConsoleHandler.level = INFO 9-45 Конфигурационные файлы
46 © Luxoft Training 2013 LoggerConfigTutor Журналирование Конфигурационные файлы
47 © Luxoft Training 2013Упражнение 9-47 Упражнение 21 Использование системы журналирования
48 © Luxoft Training 2013 Модуль 9 Введение Уровни логирования Хэндлеры Фильтры Иерархия логеров Общий сценарий логирования Конфигурационные файлы 9-48 Система журналирования Java