Автор статьи — Игорь Артамонов Для ведения лога, как я вижу, чаще используют Log4j, как минимум в тех проектах где я участвовал это стандарт. Но при первом знакомстве с ним у многих возникают проблемы с пониманием того как это работает и как его использовать. Я на самом деле ни разу не понимаю почему log4j вызывает такие трудности… потому попробую объяснить.

Java код Начиная писать класс, первой строкой я обычно пишу: private static final Logger log = Logger.getLogger(ТекущийКласс.class); И даже забиваю это в шаблоны создания класса, умная ide сама сможет подставить ТекущийКласс (это уже в хелпе смотрите). Что делает эта строка: создает нам объект которым мы можем писать лог, читая все настройки для данного логгера. О настройках позднее. Позже мы можем писать следующее:

log.debug(«Start processing»); //код if (log.isDebugEnabled()) < log.debug(«Result: «+result); >//код try < //код >catch (Exception e) < log.error(«Something failed», e); >//код log.debug(«done»);

т.е. у log есть методы .debug(), .info(), .warn(), .error(), .fatal() которые передают в лог сообщения с соответствующем уровнем.

УПРАВЛЯЮ ТВОИМ КОМПЬЮТЕРОМ / УЯЗВИМОСТЬ В МАЙНКРАФТ / LOG4J EXPLOIT | Crashing minecraft Servers |

В случае если у нас сообщение для лога строится из нескольких строк, или вообще делается какая то операция, то лучше перед этим сделать проверку на то что данный уровень логгирования в данный момент включён, методом isУровеньEnabled (как в примере isDebugEnabled () ). Это стоит проверять для того чтобы не выполнять лишние операции когда результат нам просто далее не понадобится. Если пишется просто строка то нет смысла проверять уровень, внутри log4j и так все проверится и не пройдёт в лог если он выключен.

Ещё, как видно в примере, можно туда же передать exception , и log4j выведет stacktrace в лог. С этим всем думаю проблем не возникает, все просто и можно использовать не особо задумываясь. Настройка log4j Самой простой настройкой будет положить файлик log4j.properties в classpath нашего приложения, и все описать в нем. В classpath означает в его корне, т.е. если у вас все берётся из ./classes то должен быть ./classes/log4j.properties . Туда скопировать может и ide, из директории с исходным и файлами, т.е. если у вас исходники хранятся в ./src , то создайте ./src/log4j.properties , при компиляции среда сама скопирует файла в директорию с классами. Пример настройки log4j в этом файле:

Читайте также:  Лего Майнкрафт дом крипера инструкция

log4j.rootLogger=warn, stdout, file 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 %t %c:%M:%L — %m%n log4j.appender.file=org.apache.log4j.FileAppender log4j.appender.file.file=myproject.log log4j.appender.file.layout=org.apache.log4j.PatternLayout log4j.appender.file.layout.conversionPattern=%d %5p %t %c:%M:%L — %m%n log4j.appender.debugfile=org.apache.log4j.FileAppender log4j.appender.debugfile.file=myproject-debug.log log4j.appender.debugfile.layout=org.apache.log4j.PatternLayout log4j.appender.debugfile.layout.conversionPattern=%d %5p %t %c:%M:%L — %m%n log4j.logger.com.my.app.somepackage=DEBUG, debugfile log4j.logger.com.my.app.somepackage.subpackage.ClassName=INFO

  • %d Выводит время. В скобках можно указать формат вывода, о нем подробней можно прочитать в хэлпе к стандартному классу SimpleDateFormat . И еще можно использовать именованные шаблоны, как в данном случае, это ISO8601 и ABSOLUTE. Последний означает формат HH:mm:ss,SSS , по мне так наиболее удобный вид для лога, если они не хранятся неделями и месяцами.
  • %5p Выводит уровень лога (ERROR, DEBUG, INFO и пр.), цифра 5 означает что всегда использовать 5 символов, остальное дополнится пробелами
  • %t Выводит имя потока который вывел сообщение
  • %c Категория, в скобках указывается сколько уровней выдавать. Категорией в нашем случае будет имя класса с пакетом. Ну а вообще это строка, где уровни разделены точками. Т.к. у нас совпадает с полным именем класса, то верхний уровень будет являться именем класса
  • %M Имя метода в котором произошёл вызов записи в лог
  • %L Номер строки в которой произошёл вызов записи в лог
  • %m Сообщение, которое передали в лог
  • %n Перевод строки

Более подробно модно посмотреть в JavaDoc для класса PatternLayout.

На самом деле можно не вдаваться в подробности этого шаблона, а использовать именно тот который у меня в примере, он у меня кучу лет как через copy -Dlog4j.formatMsgNoLookups=true”

Источник: forum-minecraft.ru

Учимся вести логирования с помощью Log4j

Давайте научимся следить за выполнением логики в нашей программе, для этого мы научимся использовать логирование, поймем зачем оно и где используется.

Шаг 0. Обзор

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

Читайте также:  Версия minecraft 1 8 это

Зачем нужно логирование и что оно даёт?

Допустим у вас есть WEB-проект, и он что-то делает, сейчас не важно что именно. Допустим это интернет магазин, на котором при оформлении заказа нужно отправить на почту покупателю отчет о его покупке, но почтовый сервер вышел из строя, и программно письмо не отправилось.

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

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

В данном уроке мы рассмотрим как сконфигурировать и начать использовать Log4j.

Шаг 1. Создаем проект и добавляем завимости

Запускаем всеми любимую Intellij IDEA и тыкаем New Project выбираем Maven Module и называем его :

Теперь в pom.xml жлбавим зависимость:

log4j log4j 1.2.17

Это все зависимости, которые надо было подключить.

Шаг 2. Создание примитивной логики для примера

Давайте создадим класс в котором была бы бизнес-логика, назовем его OrderLogic:

package com.devcolibri.logpack; public class OrderLogic < public void doOrder()< // какае-то логика System.out.println(«Заказ оформлен!»); addToCart(); >private void addToCart() < // добавление товара в корзину System.out.println(«Товар добавлен в корзину»); >>

Хочу обратить ваше внимание на то, что логика данного проекта не важна, так как мы рассматриваем логирование, для этого я и подготовил примитивную логику класса OrderLogic.

И теперь создаем Main класс:

package com.devcolibri.logpack; public class Main < private static OrderLogic logic; public static void main(String[] args) < logic = new OrderLogic(); logic.doOrder(); >>

Читайте также:  Как оседлать дельфина в Майнкрафт

В результате выполнения данного кода, мы получим следующее:

Заказ оформлен! Товар добавлен в корзину

Как видите пока ничего нового.

Шаг 3. Конфигурируем Log4j

Чтобы гибко управлять логированием стоит создать в resources/ файл log4j.properties:

Теперь в этот файл добавим пару строк конфигураций:

# Уровень логирования log4j.rootLogger=INFO, file # Апендер для работы с файлами log4j.appender.file=org.apache.log4j.RollingFileAppender # Путь где будет создаваться лог файл log4j.appender.file.File=C:\TMP\log_file.log # Указываем максимальный размер файла с логами log4j.appender.file.MaxFileSize=1MB # Конфигурируем шаблон вывода логов в файл log4j.appender.file.layout=org.apache.log4j.PatternLayout log4j.appender.file.layout.ConversionPattern=%d %-5p %c:%L — %m%n

Теперь давайте более детальней разберем строку формирования шаблона:

log4j.appender.file.layout.ConversionPattern=%d %-5p %c:%L — %m%n

%d – выводит дату в формате 2014-01-14 23:55:57

%-5p – выводит уровень лога (ERROR, DEBUG, INFO …), цифра 5 означает что всегда использовать 5 символов остальное дополнится пробелами, а минус (-), то что позиционирование по левой стороне.

%c – категория, в скобках указывается сколько уровней выдавать. Так как у нас 1 уровень то писаться будет только имя класса.

%L – номер строки в которой произошёл вызов записи в лог.

%m – сообщение, которое передали в лог.

%n – переход на новую строку.

Шаг 4. Добавляем примитивное логирование

Теперь в класс OrderLogic добави логирование и посмотрим на результат:

package com.devcolibri.logpack; import org.apache.log4j.Logger; public class OrderLogic < // Инициализация логера private static final Logger log = Logger.getLogger(OrderLogic.class); public void doOrder()< // какае-то логика System.out.println(«Заказ оформлен!»); // логируем инфо log.info(«Это информационное сообщение!»); addToCart(); >private void addToCart() < // добавление товара в корзину System.out.println(«Товар добавлен в корзину»); // логируем ошибку log.error(«Это сообщение ошибки»); >>

Теперь давайте запустим код опять. Мы получим тот же результат, вот только уже по пути C://TMP/ будет лежать файл log_file.log со следующим содержимым:

2014-01-14 23:55:57 INFO OrderLogic:12 — Это информационное сообщение! 2014-01-14 23:55:57 ERROR OrderLogic:19 — Это сообщение ошибки

Источник: devcolibri.com