Статьи

Настройка Log4j 2.0

Мы все ближе и ближе приближаемся к выпуску Log4j 2 GA, и по этой причине мы должны начать искать то, что он нам даст.

Лично у меня есть много причин для волнения по поводу Log4j 2.0. Сообщество великолепно, лицензия Apache дает мне большую свободу и, наконец, она защищена Apache Software Foundation. И эй, это отличная программа.

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

С Log4j 1 и Logback вы настраиваете за счет расширения классов и реализации интерфейсов. Одно это было выполнимо, но было не так просто предоставить свои собственные элементы конфигурации.

Руководство Log4j подводит его к сути:

Log4j 1.x допускается для расширения, требуя атрибуты класса в большинстве объявлений конфигурации. В случае некоторых элементов, в частности, PatternLayout, единственным способом добавления новых преобразователей шаблонов было расширение класса PatternLayout и добавление их через код.

С Log4j 2.0 можно написать эти настройки:

  • Core: вы можете написать Appender, Logger или Filter.
  • Конвертер: вы можете преобразовать некоторые сообщения LogEvent (например: преобразовать дату)
  • Поиски: поиск некоторого ресурса (в примере: получение некоторого значения из системных свойств)
  • Ключевые провайдеры: вы можете предоставить функции шифрования для ваших журналов

Во многих случаях Appender — самая интересная вещь, с которой нужно иметь дело. Appender — это последний элемент архитектуры Log4js, который фактически что- то делает с Log-Event. Например, Appender может записать в файл или отправить событие Log в базу данных.

Давайте посмотрим на тривиальный Appender, который действительно существует: File Appender .

Если нам нужно создать что-то вроде этого, мы сначала аннотируем наш класс с помощью @Plugin:

1
2
3
4
5
6
@Plugin(name = "File",
   category = "Core",
   elementType = "appender",
   printObject = true)
public final class FileAppender
   extends AbstractOutputStreamAppender<FileManager> {

Самое главное, чтобы в аннотации было указано имя плагина, его категория «Core» и тип элемента «appender», сообщая log4j, что это будет appender. Имя плагинов используется для нашего файла конфигурации позже.

На данный момент вы уже почти свободны реализовать все, что вы хотите. Вам просто нужно убедиться, что вы реализовали интерфейс Appender . В FileAppender расширен объект AbstractOutputStreamAppender, который реализует интерфейс Appender. Вам не нужно делать это на самом деле, но это имеет смысл. В отличие от других фреймворков, Log4j 2.0 работает с байтовыми массивами под капотом, что позволяет вам делать намного больше вещей. Вы часто хотите продолжать эту традицию.

Есть только одна вещь, которую вам нужно сделать для вашего Appender: реализовать фабрику плагинов в классе Appenders. Ниже приведена сокращенная версия File-Appender:

01
02
03
04
05
06
07
08
09
10
11
12
13
@PluginFactory
public static FileAppender createAppender(
  @PluginAttribute("fileName") final String fileName,
  ...
  @PluginElement("Layout") Layout<? extends Serializable> layout,
  @PluginElement("Filters") final Filter filter
  ...) {
 
    // Do things...
 
   return new FileAppender(
     layout, filter, fileName, ...);
}

Заводской метод аннотируется с помощью @PluginFactory. Он статичен и создает экземпляр Appender. Завод также занимается конфигурацией. Он принимает атрибуты, аннотированные @PluginAttribute или @PluginElement. Вы можете догадаться, это элементы из вашей конфигурации. Это может выглядеть так:

1
2
3
4
5
6
7
8
<Configuration>
  <Appenders>
    <File name="File" fileName="target/mylog.log">
      <PatternLayout>
        <Pattern>%d %p %C{1.} [%t] %m%n</Pattern>
      </PatternLayout>
    </File>
    ...

@PluginAttribute называет атрибуты вашего элемента appender (в данном случае «File»). @PluginElement именует вложенные элементы, например, PatternLayout является экземпляром Layout.

Sidenote: вы, возможно, заметили улучшенную читаемость файла конфигурации. Это также новая функция Log4j 2.0. Однако, если у вас есть причины придерживаться строгого стиля, вы все равно можете написать свою конфигурацию так:

1
<Appender type="File" name="File" fileName="target/mylog.log">

Теперь предположим, что мы получили совершенно новый плагин, который находится в пакете наших компаний. Как заставить Log4j 2.0 распознавать это? Это не было тривиально с Log4j 1, но это просто с новым Log4j.

Просто добавьте в конфигурацию один или несколько пакетов, содержащих ваши дополнения:

1
<Configuration packages="de.grobmeier.appenders">

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

Давайте подведем итоги. Для создания собственного приложения для Log4j 2.0 потребуется три шага:

  • Создайте класс, который реализует Appender и имеет аннотацию @Plugin
  • Создайте статический метод с аннотацией @PluginFactory
  • Добавьте ваш appender в вашу конфигурацию

С архитектурой плагина возможны даже сложные настройки. Например, вы можете создать абстрактный «NoSQL Appender» для баз данных NoSQL в целом, а затем предоставить различные реализации на основе этого. Это уже реальность, так как Log4j поддерживает MongoDB и CouchDB .

Если вы хотите узнать больше об этом расширенном использовании, я предлагаю вам взглянуть на пакет NoSQL .

Развлекайтесь, не забывая, мы хотели бы увидеть, что вы создали в списке рассылки Log4j .

Ссылка: Настройка Log4j 2.0 от нашего партнера JCG Кристиана Гробмайера в блоге PHP и Java Entwickler .