Что такое логирование java
Перейти к содержимому

Что такое логирование java

  • автор:

Логирование в Java / quick start

В ходе моей работы в компании DataArt я, в числе прочего, занимаюсь менторской деятельностью. В частности это включает в себя проверку учебных заданий сделанных практикантами. В последнее время в заданиях наметилась тенденция «странного» использования логеров. Мы с коллегами решили включить в текст задания ссылку на статью с описанием java logging best practices, но оказалось, что такой статьи в которой бы просто и без лишних деталей на практике объяснялось бы как надо писать в лог на Java, вот так вот с ходу не находится.

Данная статья не содержит каких-то откровений, в ней не рассматриваются тонкости какого либо из многочисленных java logging frameworks. Здесь рассказываю как записать в лог так, чтобы это не вызвало удивления у Ваших коллег, основная цель написания включить ее в список обязательного чтения для практикантов. Если все еще интересно, читайте дальше

  • Весь код примеров использует java.util.logging framework. Вопрос «Какой из фреймворков логирования ниболее кошерен» я оставлю за кадром. Скажу только что до java.util.logging проще всего дотянуться ибо он уже идет вместе с JRE и на самом деле рассказанное в данной статье с минимальными косметическими правками верно для подавляющего большинства систем логирования.
  • В целом рецепты приведенные в данной статье не являются единственно верными, есть моменты о которых можно поспорить, но в целом эти рецепты используются многие годы, многими разработчиками, во многих проектах и они достаточно хороши чтобы им следовать если у Вас нет каких-то совсем уже серьезных возражений.
  • В статье не рассматриваются такие «продвинутые» топики как:
    • Конфигурирование уровней для отдельных логеров
    • Форматирования логов
    • Асинхронное логирование
    • Создание собственных уровней логирования в Log4J
    • Контекстное логирование
    • И многое другое
    Пример №1
    Хорошо
    public class SomeClass < private static Logger log = Logger.getLogger(SomeClass.class.getName()); public void someMethod() < log.info("Some message"); >. 
    1. Логер это статическое поле класса инициализируемое при загрузке класса, имеет простое, короткое имя, важно чтобы во всех Ваших классах переменная логера называлась одинаково (это диктуется общим правилом, одинаковые вещи в программе должны делаться одинаковым образом).
    2. В качестве имени логера я использую имя класса, на самом деле это не единственный способ, можно пытаться организовать какую-то свою иерархию логирования (например transport layer/app layer для подсистем имеющих дело с обменом данными), но как показывает практика выдумывать и главное потом неукоснительно следовать такой иерархии крайне сложно, а вариант с именами логеров совпадающими с именами классов весьма хорош и используется в 99% проектов
    3. Здесь для записи в лог я использую короткий метод .info, а не более общий метод .log, так много лаконичнее
    4. Имя логера берется как SomeClass.class.getName(), а не как «com.dataart.demo.java.logging.SomeClass», оба способа по идее одинаковы, но первый защищает Вас от сюрпризов при рефакторинге имени/пакета класса
    Плохо
    public class SomeClass < public void someMethod() < Logger.getLogger("com.dataart.demo.java.logging.SomeClass").log(Level.INFO,"Some message"); >. 

    По сути тоже самое но букв больше и читается не так легко.

    Замечание между примерами

    Вы наверное обратили внимание, что все сообщения в примерах на английском языке. Это не случайно. Дело в том, что даже если все-все кто работает и будет работать с Вашим кодом говорят по русски, есть вероятность, что Вам придется просматривать лог сообщения на удаленном компьютере например через ssh при этом в большом количестве случаев Вы увидите примерно такое сообщение «. . . » (я безусловно знаю что через ssh можно протащить русские буквы, но вот почему-то далеко не всегда все оказывается настроенным должным образом).
    Или даже на локальной машине в cmd вы можете увидеть что вот такое:
    INFO: ╨Ъ╨░╨║╨╛╨╡-╤В╨╛ ╤Б╨╛╨╛╨▒╤Й╨╡╨╜╨╕╨╡ ╨▓ ╨╗╨╛╨│

    С этим безусловно тоже можно бороться. Но не всегда легко объяснить заказчику на том конце телефонной трубки, как сделать так чтобы вместо крякозябр были видны русские буквы.
    Совет: Пишите лог сообщения на английском языке, ну или в крайнем случае латинскими буквами.

    Пример №2
    Хорошо
     try < throw new Exception("Some exception"); >catch (Exception ex) < log.log(Level.SEVERE, "Exception: ", ex); >//В стандартной лог конфигурации вы это сообщение не увидите log.fine("some minor, debug message"); /* Иногда вывод лог сообщений требует достаточно больших ресурсов (например дамп какого-то пакета данных и т.п.). В таких случаях стоит проверить выведется ли в лог сообщение для этого уровня логирования */ if (log.isLoggable(Level.FINE))
    1. Если Вам необходимо залогировать исключение, для этого служит метод .log(level,message,exception)
    2. Если вы специально не настроили конфигурацию лог системы, сообщения с уровнем ниже info, например fine выводиться не будут. Но писать их по крайней мере для важных частей системы стоит. Когда что-то пойдет не так, Вы настроите более подробный уровень логирования и увидите много интересного.
    3. Слишком много лог сообщений, даже если они физически не пишутся в лог файл из-за своего слишком маленького уровня, могут существенно замедлить выполнение программы. Особенно если для подготовки самого сообщения надо потратить много ресурсов. Для этого есть метод .isLoggable(level) — он позволяет узнать пропустит ли текущая конфигурация логера данное сообщение
    Плохо
     try < throw new Exception("Some exception"); >catch (Exception ex) < log.severe("Exception: " + ex.toString() ); >log.fine("Some CPU consuming message: " + itTakes500MillisecondsToPrepageThisMessage()); 

    Если логировать только ex.toString(), то потом Вы не сможете понять в какой строке изначально сработало исключение.

    Пример №3

    Логер надо конфигурировать. Есть конфигурация по умолчанию она выводит в консоль все сообщения с уровнем INFO и выше. Она достаточно хороша, для разработки из IDE, но для реального приложения ее обычно неплохо бы подправить.

    Какие тут есть варианты

    По умолчанию: Файл logging.properties для уровня INFO, вывод в консоль

    #Console handler
    handlers= java.util.logging.ConsoleHandler
    .level=INFO

    Делаем логирование более подробным выводим еще и сообщения уровня FINE

    #Console handler
    handlers= java.util.logging.ConsoleHandler
    .level=FINE
    java.util.logging.ConsoleHandler.level = FINE

    • Установили уровень FINE для корневого логера, просто чтобы сообщения пролезали внутрь лог системы.
    • И сказали что все что пролезет через лог систему надо выводить на консоль от уровня FINE и выше.
    Выводим лог сообщения куда-то еще
    • Если приложение запускается с помощью javaw Вы вообще ничего не увидите.
    • Если вывод идет в консоль и нужное вам сообщение промелькнуло 4 часа назад буфер консоли его уже съел, информация пропала.
    • Если вывод консоли направлен в файл java com.yourcompanyname.EntryClass 2>>application_log.txt и приложение работает не останавливаясь несколько недель — файл будет весьма и весьма большим, рискуя занять весь диск.

    Чтобы решить эти проблемы был придуман java.util.logging.FileHandler — хэндлер который выводит лог сообщения в файл. При этом он умеет ротировать файлы, т.е. после достижения максимально допустимого размера, он дописывает в файл текщуее лог сообщение и открывает новый файл с инкрементальным префиксом. И так по кругу. Например

    handlers= java.util.logging.FileHandler java.util.logging.FileHandler.pattern = application_log.txt java.util.logging.FileHandler.limit = 50 java.util.logging.FileHandler.count = 7 java.util.logging.FileHandler.formatter = java.util.logging.SimpleFormatter

    создаст вот такие файлы (последняя колонка — размер в байтах)

    application_log.txt.0 │ 0 application_log.txt.1 │ 79 application_log.txt.2 │ 79 application_log.txt.3 │ 676 application_log.txt.4 │ 87 application_log.txt.5 │ 114

    Мы указали максимальный размер 50 байтов, в реальной жизни надо скорее указывать не меньше мегабайта, например вот так (я знаю, что 1000000 это чуть меньше мегабайта, но кому охота по памяти писать 1048576, если суть дела это фактически не меняет)

    java.util.logging.FileHandler.limit = 1000000

    В примере, как мы видим, файлы получились больше 50 байт потому что размер по сути округляется вверх до последнего целого лог сообщения. Т.е. если Вы укажете размер 1 байт и запишете лог сообщение размером в 1000 байт то размер файла станет 1000 байт и после этого лог сообщения файл закроется и откроется следующий.

    copy & paste конфиг для реальной жизни, его вполне хватает для большинства service, console и desktop приложений.

    handlers= java.util.logging.FileHandler java.util.logging.FileHandler.pattern = application_log.txt java.util.logging.FileHandler.limit = 1000000 java.util.logging.FileHandler.count = 5 java.util.logging.FileHandler.formatter = java.util.logging.SimpleFormatter
    Последняя часть магии
    1. Из командной строки запуска приложения
    2. В первых строчках кода Вашего приложения

    Первый чуть более правильный ибо он декларативный и работает сразу, до того как начал работать код Вашего приложения.

    Вот так

    java Djava.util.logging.config.file=logging.properties com.dataart.application.ClassName

    Но к сожалению менять строку запуска не всегда можно или не всегда удобно. Второй способ тоже неплохо работает.

     public static void main(String[] args) < try < LogManager.getLogManager().readConfiguration( MainApplicationEntryClass.class.getResourceAsStream("/logging.properties")); >catch (IOException e) < System.err.println("Could not setup logger configuration: " + e.toString()); >. 

    • Здесь MainApplicationEntryClass — это класс — точка входа в Ваше приложение, видимо имя класса у Вас будет другое
    • Сам файл logging.properties как правило в таких случаях кладется в корень иерархии классов и выглядит это например вот так

    Что осталось за кадром
    • Log4J
    • JULI logger (строго говоря это не вполне самостоятельный фреймворк, а своего рода надстройка над java.util.logging)
    • SLF4J
    • Commons Logging
    • Tomcat
    • JBoss
    • Resin

    Логирование в Java – Logger

    При создании приложений мы часто сталкиваемся с ошибками, которые необходимо отлаживать. Итак, с помощью логов мы можем легко получить информацию о том, что происходит в приложении, с записью ошибок и необычных обстоятельств. Теперь вам может показаться, что почему бы не использовать оператор System.out.print() в Java.

    Проблема с этими утверждениями состоит в том, что сообщения журнала будут печататься только на консоли. Поэтому, как только вы закроете консоль автоматически, все журналы будут потеряны. Они не хранятся постоянно и будут отображаться один за другим, так как это однопоточная среда.

    Чтобы избежать таких проблем, логирование в Java упрощается с помощью API, предоставляемого через пакет java.util.logging пакет org.apache.log4j.* .

    Компоненты

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

    • Loggers – отвечает за сбор записей журнала и передачу их соответствующему заявителю.
    • Appenders или Handlers – они отвечают за запись событий журнала в пункт назначения. Аппендеры форматируют события с помощью макетов перед отправкой результатов.
    • Layouts или Formatters – отвечает за определение того, как данные выглядят, когда они появляются в записи журнала.

    Вы можете обратиться к изображению ниже для работы всех трех компонентов:

    Компоненты Logger в Java

    Когда приложение выполняет вызов регистрации, компонент Logger записывает событие в LogRecord и перенаправляет его соответствующему Appender. Затем он форматировал запись, используя формат в соответствии с требуемым форматом. Помимо этого, вы также можете использовать более одного фильтра, чтобы указать, какие Appenders следует использовать для событий.

    Что такое Логгеры (Logger) в Java?

    Логгеры (Logger) в Java – это объекты, которые запускают события журнала. Они создаются и вызываются в коде приложения, где генерируют события журнала перед передачей их следующему компоненту, который является Appender.

    Вы можете использовать несколько логгеров в одном классе для ответа на различные события или использовать в иерархии. Они обычно называются с использованием иерархического пространства имен, разделенных точками. Кроме того, все имена Logger должны основываться на классе или имени пакета зарегистрированного компонента.

    Кроме того, каждый логгер отслеживает ближайшего существующего предка в пространстве имен, а также имеет связанный с ним «уровень».

    Как создать?

    Вы должны использовать Logger.getLogger() . Метод getLogger() идентифицирует имя Logger и принимает строку в качестве параметра. Таким образом, если Logger уже существует, он возвращается, в противном случае создается новый.

    Синтаксис

    static Logger logger = Logger.getLogger(SampleClass.class.getName());

    Здесь SampleClass – это имя класса, для которого мы получаем объект Logger.

    public class Customer < private static final Logger LOGGER = Logger.getLogger(Customer.class); public void getCustomerDetails() < >>

    Уровни

    Уровни журналов используются для классификации их по степени серьезности или влиянию на стабильность приложения. Пакет org.apache.log4j.* и java.util.logging предоставляют разные уровни ведения журнала.

    Пакет org.apache.log4j.* предоставляет следующие уровни в порядке убывания:

    Пакет java.util.logging предоставляет следующие уровни в порядке убывания:

    • SEVERE(HIGHEST LEVEL);
    • WARNING;
    • INFO;
    • CONFIG;
    • FINE;
    • FINER;
    • FINEST(LOWEST LEVEL).

    Помимо этого, вышеприведенный пакет также предоставляет два дополнительных уровня ALL и OFF используются для регистрации всех сообщений и отключения регистрации соответственно.

    Пример с использованием пакета org.apache.log4j.*

    import org.apache.log4j.Logger; public class Customer < static Logger logger = Logger.getLogger(Customer.class); public static void main(String[] args) < logger.error("ERROR"); logger.warn("WARNING"); logger.fatal("FATAL"); logger.debug("DEBUG"); logger.info("INFO"); System.out.println("Final Output"); >>

    Таким образом, если в нашем файле log4j.properties ваш вывод является корневым логгером уровня WARN, то все сообщения об ошибках с более высоким приоритетом, чем WARN, будут напечатаны, как показано ниже:

    Вы также можете установить уровень с помощью метода setLevel() из пакета java.util.logging , как java.util.logging ниже:

    logger.setLevel(Level.WARNING);

    Пример с использованием пакета java.util.logging

    package edureka; import java.io.IOException; import java.util.logging.Level; import java.util.logging.Logger; import java.util.logging.*; class EdurekaLogger < private final static Logger LOGGER = Logger.getLogger(Logger.GLOBAL_LOGGER_NAME); public void sampleLog() < LOGGER.log(Level.WARNING, "Welcome to Edureka!"); >> public class Customer < public static void main(String[] args) < EdurekaLogger obj = new EdurekaLogger(); obj.sampleLog(); LogManager slg = LogManager.getLogManager(); Logger log = slg.getLogger(Logger.GLOBAL_LOGGER_NAME); log.log(Level.WARNING, "Hi! Welcome from Edureka"); >>

    Чтобы включить вход в приложение с помощью пакета org.apache.log4j.* Или пакета java.util.logging , необходимо настроить файл свойств. Далее в этой статье о Logger в Java давайте обсудим файл свойств обоих из них.

    Файл свойств пакета Log4j и Java Util

    Пример файла свойств Log4j

    # Enable Root logger option log4j.rootLogger=INFO, file, stdout # Attach appenders to print file log4j.appender.file=org.apache.log4j.RollingFileAppender log4j.appender.file.File=E:loglogging.log log4j.appender.file.MaxFileSize=10MB log4j.appender.file.MaxBackupIndex=5 log4j.appender.file.layout=org.apache.log4j.PatternLayout log4j.appender.file.layout.ConversionPattern=%d %-5p %c:%L - %m%n # Attach appenders to print on console log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.Target=System.out log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%d %-5p %c:%L - %m%n
    • Файл свойств Log4j создается внутри папки src проекта.
    • log4j.appender.file = org.apache.log4j.RollingFileAppender -> Печатает все журналы в файле
    • log4j.appender.stdout = org.apache.log4j.ConsoleAppender -> Печатает все журналы в консоли
    • log4j.appender.file.File = D: loglogging.log -> Указывает расположение файла журнала
    • log4j.appender.file.MaxFileSize = 10 МБ -> Максимальный размер файла журнала до 10 МБ
    • log4j.appender.file.MaxBackupIndex = 5 -> Ограничивает количество файлов резервных копий до 5
    • log4j.appender.file.layout = org.apache.log4j.PatternLayout -> Указывает шаблон, в котором журналы будут печататься в файл журнала.
    • log4j.appender.file.layout.ConversionPattern =% d % -5p% c :% L -% m% n -> Устанавливает шаблон преобразования по умолчанию.

    Пример файла свойств пакета Java Util

    handlers= java.util.logging.ConsoleHandler .level= WARNING # Output will be stored in the default directory java.util.logging.FileHandler.pattern = %h/java%u.log java.util.logging.FileHandler.limit = 60000 java.util.logging.FileHandler.count = 1 java.util.logging.FileHandler.formatter = java.util.logging.XMLFormatter # Level of logs will be limited to WARNING and above. java.util.logging.ConsoleHandler.level = WARNING java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter
    • java.util.logging.FileHandler.pattern =% h / java% u.log -> Файлы журнала будут записаны в C: TEMPjava1.log
    • java.util.logging.FileHandler.limit = 50000 -> Максимальная сумма, которую регистратор записывает в один файл в байтах.
    • java.util.logging.FileHandler.count = 1 -> Указывает количество выходных файлов
    • java.util.logging.FileHandler.formatter = java.util.logging.XMLFormatter -> Упоминает форматер, используемый для форматирования. Здесь используется XML Formatter.
    • java.util.logging.ConsoleHandler.level = WARNING -> Устанавливает уровень журнала по умолчанию для WARNING
    • java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter -> Указывает форматер, используемый всеми ConsoleHandler. Здесь используется SimpleFormatter.

    Регистрация событий

    Чтобы регистрировать события в Java, вы должны убедиться, что вы назначаете уровень, чтобы легко отфильтровать события. Чтобы назначить уровень и упомянуть сообщение, вы можете использовать следующие методы:

    Способ 1

    logger.log(Level.INFO, “Display message”);
    Here, level is INFO and the message to be printed is "Display Message".

    Способ 2

    logger.info(“Display message”);

    Чтобы убедиться, что Logger регистрирует только события, которые находятся на уровне или выше уровня INFO, вы можете использовать метод setLevel(), описанный выше.

    Appender или Handlers

    Appender или Handlers отвечают за запись событий журнала в пункт назначения. Каждый регистратор имеет доступ к нескольким обработчикам и получает сообщение журнала от регистратора. Затем Appenders используют средства форматирования или макеты для форматирования событий и отправки их в соответствующее место назначения.

    Appender можно отключить с помощью метода setLevel (Level.OFF). Два наиболее стандартных обработчика в пакете java.util.logging :

    • FileHandler: записать сообщение журнала в файл.
    • ConsoleHandler: записывает сообщение журнала в консоль.

    Layout или Formatters

    Используются для форматирования и преобразования данных в журнале событий. Каркасы журналов предоставляют макеты для HTML, XML, Syslog, JSON, простого текста и других журналов.

    Логирование Java: терминология, уровни логирования, log-файлы

    Lorem ipsum dolor

    Напишем

    Логирование Java — это процесс , при котором программа на Java-языке записывает сведения о своем исполнении в некий файл или базу данных. Логирование дает возможность отслеживать ход исполнения программы и конкретно кода.

    Иногда с вашим программным продуктом происходит что-то непонятное , и он начинает себя вести не так , как задумано. Первое , что приходит на ум в этом случае , — в программе есть наличие ошибок. Самый п р остой способ это проверить — использовать логи программы, так как это возможность посмотреть, что происходит «внутри» самой программы.

    Логирование Java напоминает процесс работы «черного ящика» в самолете — в случае возникновения критических ситуаций оно способно «рассказать», что не так работает и на что обратить внимание.

    Термин «лог» — что это такое?

    Напишем

    Логирование — это процесс, который неразрывно связан с термином «лог». Лог с английского можно перевести как «бортовой журнал».

    В программировании лог — это специальный файл, который выполняет функцию «бортового журнала» программы. Именно в этот файл, а точнее , в лог программа производит записи о своей работе. Лог-файлы программа может создавать самостоятельно, чтобы вносить туда текстовые пометки.

    Лог-файлы помогают «следить» за действиями программы, например, что она функционирует в конкретный момент времени или как она реагирует на действия пользователя.

    У одного программного продукта лог-файлы могут быть разные. Например , может быть лог — файл типа:

    • «access_log», в котором фиксируются действия программы при ее взаимодействии с пользователями;
    • «error_log», в котором фиксируются все ошибки, произош едшие в результате работы программы;
    • и др.

    В одном лог-файле может быть множество записей, где каждая строчка будет содержать отдельные результаты для каждого взаимодействия с программой. То есть в каждой записи будет информация о том , что происходило с программным продуктом в конкретный момент времени.

    Отметим различия между «логированием» и «логом»:

    • логирование — это процесс, при котором программа прописывает какие-то записи в лог-файлы;
    • лог — это сам файл или то место , куда программа производит необходимые записи.

    Уровни логирования

    Напишем

    Мы выяснили, что такое логи и что такое логирование Java. Не трудно догадаться, что если в лог-фай л записывать все действия программы, то там будет большое количество различных сведений. В некоторых ситуациях лог-файлы могут генерироваться очень быстро и в огромных размерах. В этом случае найти нужную информацию в логах будет очень не легко. Поэтому, чтобы контролировать объемы записываемой информации, придумали различные уровни логирования.

    Уровни логирования применяются в программах на различных языках программирования, в том числе и на Java. Различают несколько основных уровней:

    • debug — выводится информация, которая пригодится для отладки программы;
    • info — обычные и стандартные сообщения;
    • warning — нефатальное предупреждение;
    • error — записи ошибок;
    • fatal — фатальная ошибка;
    • off — сообщения не выводятся;
    • trace — информация для точной отладки;
    • all — выводится вся информация.

    «Поддержать» уровни логирования в Java можно двумя способами:

    1. Внутри программы можно расставить вызов нужной библиотеки в соответствии с заданным уровнем. Например, если произойдет ошибка, она будет логироваться как «error» и т. д.
    2. В момент запуска программы нужно указать уровень логирования для конкретной ситуации. Если ничего не указывать, то для программы будет применяться уровень «info», где буд у т записываться все ключевые и важные события, происходящие с программой, в том числе «warning» и «error». Если указать «error», будут записываться только ошибки.

    Логирование Java: термины

    Напишем

    Библиотеки логирования Java включают в себя 3 основных термина:

    1. Logger — это некий объект, который отвечает за запись информации в лог-файлы, опираясь на заданные уровни логирования. Основная задача логгера — не пропустить событие, которое нужно записать в лог-файл.
    2. Appender — это конечная точка, куда «приходит» информация для логирования. В качестве appender мо гут выступать: файл, база данных, консоль, сокет и др. У appender нет каких-либо ограничений, куда записывать сообщения. Все ограничивается только вашими способностями. Если Logger — это начальная точка в логировании, то Appender — это конечная точка. При этом один «логгер» может содержать несколько «аппендеров» и наоборот.
    3. Layout — это формат, в котором выводятся сообщения. Форматирование сообщений напрямую зависит от используемой библиотеки при логировании.

    Библиотеки логирования Java

    Напишем

    Библиотеки логирования Java — это набор инструментов, который применяют при логировании программ. Различают несколько популярных инструментов логирования:

    1. Apache log4j. Это первый набор инструментов для логирования Java, который появился еще в 1999-м году. Внутри себя имеет различны е способы вывода логов, несколько форматов логирования и мн. др. Раньше данная библиотека активно применялась, но уже долгое время этот проект не развивается.
    2. JUL. Имеет множество уровней логирования, например , только для отладки у этого инструмента есть в арсенале 3 отладочных уровня вместо одного стандартного.
    3. SLF4J. Этот инструмент является оберткой над многими популярными логгерами, например: logback, log4j, jul и др., поэтому его рекомендуется использовать в паре с полноценной библиотекой для логирования.
    4. Logback был создан как альтернатива умирающему log4j, поэтому он вобрал в себя все лучшее из этого инструмента, при этом усовершенствовал некоторые показатели.

    Заключение

    Дочитав статью, вы уже точно знаете , что такое логи, лог-файлы и логирование в Java. Также мы познакомились с основными терминами и инструментами в логиров а нии Java. Подробнее на каждом из них мы остановимся в следующих наших статьях, потому что проблему логирования Java нужно разбирать постепенно. А проблема есть, так как присутствует огромное количество разнообразного инструмента логирования, при этом нет четких стандартов самого логирования.

    Мы будем очень благодарны

    если под понравившемся материалом Вы нажмёте одну из кнопок социальных сетей и поделитесь с друзьями.

    Библиотеки логирования: понятие, суть, функции

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

    Библиотеки логирования

    Прежде, чем переходить к библиотекам, рассмотрим основные инструменты логирования языка Java — Logger, Appender, Layout.

    Logger — это инструмент, отвечающий за запись информации о работе системы в лог-файл. Logger предоставляет различные уровни логирования, которые можно использовать для классификации сообщений – например, TRACE, DEBUG, INFO, WARN и ERROR. Каждый из них имеет свою степень приоритетности и позволяет настраивать запись логов в зависимости от уровня важности сообщения. Правильно и четко сформированные журналы логов значительно упрощают расследование разных инцидентов, происходящих в процессе функционирования интернет-ресурсов.

    Appender второй по значимости инструмент. Используется не менее часто, чем Логгер. Он отвечает за то, куда и каким образом будут выводиться записи и где они будут храниться. Appender определяет тип выходных данных, форматирование сообщений и фильтрацию записей. Благодаря Appender можно настроить Logger таким образом, чтобы сохранялись только самые важные сообщения в конкретном месте и в заданном формате.

    Существует большое количество типов Appender. Все они отличаются целями использования. Например, в языке Java существует FileAppender, который пишет сообщения в отдельный файл, ConsoleAppender, который выводит логи на консоль, а также SocketAppender, который направляет логи на отдельный удаленный сервер.

    Кроме того, с помощью нескольких Appender можно настроить один Logger таким образом, чтобы журналы логов сохранялись в нескольких местах одновременно.

    Layout еще один важный инструмент логирования. Он отвечает за то, каким образом информация будет записываться в лог-файл. Этот инструмент задает формат выведения сообщения: какие поля будут включены в файл, как они будут форматироваться, в каком порядке будут выводиться и т.д.

    Разные типы Layout могут быть использованы для различных целей. Например, SimpleLayout просто выводит текст сообщения, а PatternLayout позволяет настраивать формат записи сообщений с помощью строки формата.

    Инструментарий логгинга основан на готовых решениях — библиотеках. Рассмотрим их подробнее.

    Обзор бибилиотек логгеров log4j, JUL, SLF4J, Logback

    Библиотеки логгеров предоставляют собой набор функций и методов для создания логов. Наиболее популярными библиотеками являются:

    1. log4j. Быстро, надежно ведет журналы. Написана на Java и распространяется по лицензии apache. log4j портировали на разные языки: С, С++, python и т.д. Благодаря внешним файлам легко настраивается. Журнал ведется исходя из уровня приоритета. Он может предложить разные механизмы, которые направляют информацию регистрации на разные точки (файлы, консоли, системные журналы и т.д.).
    2. JUL. Самый главный плюс данного решения, это то, что он включен в JDK. В качестве основы здесь взят log4j. Благодаря решению IBM ‒ JUL активно развивается. Из недостатков можно выделить то, что JUL немного ухудшает понимание уровней, т.к. они отличаются от Logback и Log4j.
    3. SLF4J.Так называемая обертка над оберткой, которая работает на log4j, JUL, common-loggins. Инструмент делится на две части: API для приложения и реализация под каждый из видов логирования. Поддерживаются функции форматирования.
    4. Logback. Инструмент написан тем же разработчиком log4j. Это его преемник. Здесь хорошая производительность, есть нативная поддержка, фильтрация. Logback не требует настроек для того, чтобы начать записывать.

    Что такое библиотека логирования. Обзор Log4Net, SeriLog, NLog

    Библиотека логирования – более объемное понятие. Оно включает в себя программные решения, обеспечивающие функциональность не только процесса фиксации, но и управления логами.

    Библиотеки позволяют формировать различные уровни логирования, фильтрацию и сортировку сообщений, поддержку различных форматов записи (текстовые файлы, базы данных, консоль и т.д.), а также другие функции, которые могут быть полезны для анализа работы приложения или системы, а также ее отладки.

    Есть несколько достаточно популярных инструментов.

    Log4Net реализовывает поименное логирование и выполняет массу других функций. Можно создать свою копию логгера, используя класс или ключ. Чтобы установить требуется создание конфигурационного файла. В сам файл разрешено добавлять фильтрацию. В конфигурацию для этого добавляются отдельные блоки.

    SeriLog не может настраиваться с помощью изменения конфигурации файлов. Присутствует статическое свойство, в котором умещается объект. Во время записи возможно добавление операторов, которые при необходимости выведут все значения объектов.

    NLog создает объекты логов с помощью кодов, файлов. Формат, который позволяет выводить сообщение можно установить, добавив в target элемент layout. Есть операторы, форматирующие строки, а также асинхронная обертка.

    Это далеко не полный перечень популярных библиотек. В целом, все возможности библиотек схожи. При выборе нужной библиотеки логирования важно понимание, какие задачи Вы преследуете, настраивая логирование для своего ресурса.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *