Статьи

Упростите регистрацию с tinylog 1.0

Tinylog размером всего 75 КБ является легкой альтернативой широко распространенным классическим системам журналирования Log4j и Logback. Финальная версия 1.0 была выпущена в конце марта после трех лет разработки. В некоторых вопросах проектирования tinylog использует намеренно иной подход, чем классические каркасы ведения журналов в Java. Эта статья покажет различия, а также сходства с Log4j и Logback и даст краткое введение в tinylog.

Статический регистратор

Обычно для каждого класса, в котором используется ведение журнала, должен быть создан собственный экземпляр средства ведения журнала. Все эти регистраторы именуются иерархически, обычно по полному имени класса. В SLF4J (Logging API logging), а также в Log4j 1.x необходимо явно передать имя класса:

1
2
3
4
5
public class MyClass {
 
   private static final Logger logger = Logger.getLogger(MyClass.class);
 
}

Как обычно для рутинной работы, это создание регистратора часто копируется из других классов. Но в этом случае легко забыть изменить параметр класса, что может привести к неправильным записям в журнале. Чтобы избежать таких проблем, Log4j 2.x способен сам определять класс. Передача имени класса в качестве параметра больше не требуется. tinylog делает еще один шаг и отказывается от необходимости создавать для каждого класса собственный экземпляр средства ведения журнала. Вместо этого tinylog имеет статический регистратор, для которого все методы ведения журнала могут быть вызваны напрямую:

1
2
3
4
5
6
7
public class Application {
 
   public static void main(String[] args) {
      Logger.info("Hello {}!", args[0]);
   }
 
}

конфигурация

Существует три способа настройки tinylog: с помощью файла свойств, системных свойств (может быть задан как параметр «-D») и программно с помощью свободного API. Конфигурации могут быть изменены во время выполнения и всегда будут установлены как единое целое. Для продуктивных сред рекомендуется поместить файл свойств с именем tinylog.properties в пакет по умолчанию. tinylog загрузит этот файл свойств по умолчанию, если никакая другая конфигурация не была явно указана.

Снимок экрана

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

1
2
3
tinylog.level = debug
tinylog.format = {level}: {class}.{method}()\t{message}

Ведущие писатели

tinylog записывает все записи журнала в консоль по умолчанию. Это поведение по умолчанию может быть перезаписано путем определения другого автора. Помимо записи в консоль поддерживается запись в файлы и базы данных SQL. Для записи в файлы tinylog есть три разных средства записи: FileWriter , SharedFileWriter и RollingFileWriter . FileWriter записывает записи журнала в определенный файл журнала. Например, это может быть определено в файле свойств следующим образом:

1
2
tinylog.writer = file
tinylog.writer.filename = log.txt

SharedFileWriter работает так же, как FileWriter , но поддерживает одновременную запись нескольких экземпляров приложения в один и тот же файл журнала без каких-либо конфликтов. RollingFileWriter позволяет продолжить существующие файлы журнала после перезапуска приложения. С помощью политик можно указать, когда должен быть запущен новый файл журнала. Определенное количество старых файлов журнала может быть сохранено как резервные копии. В этом примере новый файл журнала будет запускаться ежедневно, а файлы журнала за последние семь дней будут сохраняться как резервные копии с именем отметки времени:

1
2
3
4
5
tinylog.writer = rollingfile
tinylog.writer.filename = log.txt
tinylog.writer.policies = daily
tinylog.writer.backups = 7
tinylog.writer.label = timestamp

Производительность

В общем, регистрация стоит всего несколько наносекунд на запись в журнале. Тем не менее, можно улучшить скорость несколькими способами. Наиболее эффективный способ — включить буферизованную запись, установив свойство « tinylog.writer.buffered=true » и активировав поток записи с помощью « tinylog.writingthread=true », чтобы избежать блокирования основного приложения медленными операциями ввода-вывода. Но у обоих есть недостаток в том, что, возможно, последние — и, следовательно, самые важные — записи журнала теряются после сбоя JVM.

В частности, для больших проектов обычно выводят имя класса и метода вместе с каждой записью журнала, чтобы упростить поиск соответствующего кода. Но Log4j и Logback предупреждают, что это приведет к снижению производительности, потому что генерация такой информации трассировки стека стоит дорого. Благодаря своей архитектуре tinylog всегда знает точную глубину вызывающей стороны в трассировке стека. Таким образом, tinylog может просто извлечь единственный требуемый элемент трассировки стека вместо генерации всей трассировки стека. Это делает запись в несколько раз быстрее без пропуска важной информации трассировки стека.

Вывод

Эта статья может дать только краткое введение в tinylog. Полное руководство по всем параметрам конфигурации можно найти на сайте tinylog . tinylog публикуется под лицензией Apache License 2 , поэтому его можно использовать как с открытым исходным кодом, так и в коммерческих проектах. Есть также фасад для Log4j 1.x и привязка для SLF4J для упрощения миграции. Среди других функций, на предстоящий выпуск запланировано включение и исключение для записи, а также MailWriter для отправки журналов по почте.