Пострадавшие от тайфуна Ликима, во многих местах прошли проливные дожди. Вы не можете выходить на улицу, чтобы играть и учиться вместе по выходным. Давайте начнем с самой базовой конфигурации, а затем представим расширенные функции журнала асинхронного вывода. Если вы хотите увидеть только ту часть, в которой журналы асинхронного вывода улучшают производительность, прокрутите статью немного вниз.
Прочитав эту статью, вы узнаете
1. Лог выводится в файл и на основеLEVELУровни сохраняют категории журналов в разные файлы
SpringBootПроект поставляется сlogbackиslf4jЗависимость, поэтому основное внимание уделяется написанию файлов конфигурации, тому, какие зависимости необходимо ввести, и нам не нужно управлять конфликтами зависимостей журналов.logbackФреймы загружаются по умолчаниюclasspathназванный подlogback-springилиlogbackконфигурационный файл. Хранение всех журналов в одном файле Размер файла также увеличивается с запуском приложения, и решить проблему непросто.errorЖурналы отделены от других журналов, а журналы разных уровней записываются и хранятся в соответствии с периодами времени.
<root>Метка, обязательная метка, используемая для указания самого базового уровня вывода журнала.
<appender-ref>метка, добавитьappend
<append>метка, используя метку для указания политики сбора журналов.
nameназначение атрибутаappenderназвание
classАтрибут указывает стратегию вывода.Обычно существует два типа: вывод на консоль и вывод в файл.Вывод в файл предназначен для сохранения журнала.ConsoleAppenderвывод лога в консоль
<filter>метка, используя метку для указания политики фильтрации
<level>Метка указывает тип фильтрации
<encoder>ярлык, используйте<pattern>Тег указывает формат вывода журнала.
<rollingPolicy>Теги определяют политики сбора, такие как сбор на основе времени.
<fileNamePattern>Метка указывает место, где сохраняется сгенерированный журнал.
Благодаря этой конфигурации цель классификации и разделения журналов мобильных телефонов была достигнута.
расширенные функции logback асинхронный вывод журнала
Предыдущий метод настройки журнала основан на синхронизации, и каждый раз, когда журнал выводится в файл, выполняется дисковый ввод-вывод. Метод асинхронной записи журнала используется для предотвращения дискового ввода-вывода при записи этого журнала, блокирования потоков и ненужной потери производительности. Способ асинхронного вывода логов очень прост, добавьте лог на основе асинхронной записиappender, и укажите на ранее настроенныйappenderПросто
Тест производительности журнала асинхронного вывода
Так как производительность может быть улучшена, необходимо провести тестовое сравнение, во сколько раз можно улучшить производительность синхронных и асинхронных журналов вывода?
серверное оборудование
CPUШесть ядер
Память 8G
инструменты для тестирования
Apache Jmeter
Журнал синхронного вывода
Количество потоков: 100
Ramp-Up Loop(Это можно понимать как время, необходимое для запуска потока): 0
Можно понять, что 100 потоков включены одновременно
Результаты тестаСосредоточьтесь на метрикахThroughput【TPS】Пропускная способность: количество запросов, обработанных системой в единицу времени, в журнале выходных данных синхронизации.TPSза44.2/sec
Журнал асинхронного вывода
Количество потоков 100
Ramp-Up Loop: 0
Результаты тестаTPSза497.5/sec,Более чем в 10 раз выше производительность! ! !
Принцип асинхронного вывода журнала
отlogbackпод рамойLogger.infoспособ начать трассировку. Полный путь вызова метода показан на следующем рисунке:
Самое важное в журнале асинхронного вывода — это файл конфигурации.ch.qos.logback.classicпод пакетомAsyncAppenderBaseв классеappendметод, см. исходный код этого метода:
Определите, нужно ли удалять журнал из-за ситуации с очередью. Если нет, поместите его в очередь блокировки. Просмотрев код, очередь блокировкиArrayBlockingQueueu, размер по умолчанию — 256, который можно изменить в файле конфигурации.Logger.info(...)прибытьappend(...)Все кончено, просто запихните лог в очередь на блокировку, а потом продолжайте выполнятьLogger.info(...)следующее утверждение.
существуетAsyncAppenderBaseкласс определяетWorkerнить,runКлючевая часть кода в методе выглядит следующим образом:
E e = parent.blockingQueue.take();
aai.appendLoopOnAppenders(e);
Возьмите лог из очереди на блокировку и позвонитеAppenderAttachableImplв классеappendLoopOnAppendersметод поддержанияAppendсписок.WorkerПроцесс вызова метода в потоке в основном выглядит следующим образом:
Два наиболее важных способаencodeиwriteметод, предыдущий метод будет основан на файле конфигурацииencodeУказанный метод преобразуется в байт-код, а последний метод записывает преобразованный байт-код в файл. Таким образом, запись файла выполняется путем запуска нового потока, основной поток бросает журнал в очередь блокировки, а затем занимается другими делами. Наконец прикрепил:Полный код проекта
======================= Обновление от 02.09.2019 ===================== знак равно
Результаты теста загрязнены, количество повторений мало, а количество выборок мало.После повторного тестирования разница между синхронным выводом логбека и TPS асинхронного вывода особо не очевидна.Прикреплено:Отчет о тестировании производительности. Но есть еще сокращение времени