Введение в интегрированную среду ведения журналов Springboot

задняя часть сервер Spring Безопасность Apache Log4j

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

Он был организован в gitbook, подробности читайте по ссылке: mingrn.gitbooks.io

Spring-Boot как микросервисное приложение, интегрированное по умолчаниюlogbackлесопильная рама.logbackЭто фреймворк нового поколения, разработанный автором фреймворка log4j, он более эффективен, может адаптироваться ко многим операционным средам и, естественно, поддерживает SLF4J.

Автор недавно познакомился со SpringBoot.Я использовал log4j2 при разработке с помощью Spring, и стиль журнала logback framework, интегрированный SpringBoot по умолчанию, очень хорош. Поэтому я решил прочитать официальный сайт и сделал простой перевод того, что я понял, и исходный текст, который можно использовать для дальнейшего использования, и я надеюсь, что он также может помочь детской обуви, которая мало что знает о логбэке. . . . .

Что касается проблемы путаницы в таблицах: поскольку редактор уценки, используемый автором, представляет собой заметки летающих слонов, синхронизацияgithub(Если вам кажется, что читать на этой странице недостаточно комфортно, можете перейти на github. Я переделал markdown в html, скачал напрямую и открыл в браузере для чтения [эффект отличный! См. картинку ниже] ) Пересажу позже на Наггетс. Поэтому будут некоторые проблемы с форматированием.Если я обнаружу, что автор будет исправлять это без остановки, я также благодарю старших за их напоминания!

уценка для html-рендеринга

html效果图

Отображение печати журнала журналов по умолчанию

logback

Как видно из рисунка выше, элементы содержимого вывода журнала следующие:

  • Дата времени: с точностью до миллисекунд
  • Уровень журнала: ERROR, WARN, INFO, DEBUG или TRACE.
  • Идентификатор процесса
  • Разделитель :---Идентифицирует начало фактического журнала
  • threadname: заключено в квадратные скобки (может обрезать вывод консоли
  • Имя регистратора: обычно используется имя класса исходного кода.

Как говорится на официальном сайте: Предполагая, что файлы конфигурации logback-test.xml или logback.xml отсутствуют, logback по умолчанию вызовет BasicConfigurator, который установит минимальную конфигурацию.Эта минимальная конфигурация состоит из ConsoleAppender, подключенного к корневому регистратору.Вывод форматируется с использованием Для PatternLayoutEncoder установлен шаблон %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n, причем по умолчанию корневому регистратору назначается уровень DEBUG.

базовая конфигурация logback

Создайте logback.xml

Spting-Boot интегрирован по умолчаниюlogbackХотя некоторая информация журнала печатается, она недостаточно удобна. Он не может удовлетворить наши ежедневные потребности в развитии. Поэтому мы можем создать в корневом каталогеlogback.xmlилиlogback-spring.xmlфайл для пользовательской конфигурации

In a Spring Boot application, you can specify a Logback XML configuration file as logback.xml or logback-spring.xml in the project classpath. The Spring Boot team however recommends using the -spring variant for your logging configuration, logback-spring.xml is preferred over logback.xml. If you use the standard logback.xml configuration, Spring Boot may not be able to completely control log initialization.

Spring-Boot интегрирован по умолчаниюlogbackМне лично нравится стиль печатного журнала, а печатного журнала по умолчанию недостаточно для удовлетворения наших повседневных потребностей в разработке. Однако мы можем напрямую внести некоторые дополнительные изменения на его основе, чтобы добиться желаемого вывода журнала.Более того, если мы напрямую настраиваем вывод журнала, мы хотим выводить информацию разного цвета для разной информации в консоли.Если вы снимаете твои штаны, это совершенно не нужно, не так ли? Более того, Spring-Boot выполняет эти стандартные операции по умолчанию, так что мы можем напрямую ссылаться на него!

Версия разработки SpringBoot, используемая автором,2.0.2.REALEASEверсия, поэтому найдите ее напрямуюspring-boot-2.0.2.REALEASEПакет зависимостей. Вы можете видеть это в пакете зависимостейorg.springframework.bootКаталог уровня пакета имеет много классов пакетов, зависящих от конфигурации по умолчанию.

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

logging-logback

Есть в основном четыреxmlconfig, я могу просто создать его в нашемlogback-spring.xmlВнесено в файл конфигурацииbase.xmlконфигурационный файл.

<configuration>
	<include resource="org/springframework/boot/logging/logback/base.xml" />
</configuration>

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

Давайте посмотрим сейчасbase.xmlЧто находится в файле конфигурации.

<included>
	<include resource="org/springframework/boot/logging/logback/defaults.xml" />
	<property name="LOG_FILE" value="${LOG_FILE:-${LOG_PATH:-${LOG_TEMP:-${java.io.tmpdir:-/tmp}}}/spring.log}"/>
	<include resource="org/springframework/boot/logging/logback/console-appender.xml" />
	<include resource="org/springframework/boot/logging/logback/file-appender.xml" />
	<root level="INFO">
		<appender-ref ref="CONSOLE" />
		<appender-ref ref="FILE" />
	</root>
</included>

Наиболее заметными из них являются три<include>

  • defaults.xml
  • console-appender.xml: информация журнала вывода консоли
  • file-appender.xml: хранилище файлов журнала

Поэтому, если прямо не цитироватьbase.xmlФайл конфигурации, ссылающийся на три других файла конфигурации, имеет тот же эффект. Рекомендуется цитировать документы по отдельности и толькоdefaults.xmlиconsole-appender.xml. Поскольку несколько приложений, развернутых в одной среде, могут вызвать проблемы с разрешениями на вывод журнала.

основные свойства журнала

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

Базовый пример (только для справки)

<configuration debug="true">

	<include resource="org/springframework/boot/logging/logback/defaults.xml" />
	<include resource="org/springframework/boot/logging/logback/console-appender.xml" />

	<property name="APP_NAME" value="Logback"/>
	<property name="APP_HOME" value="/home/logback"/>
	<property name="LOG_HOME_PATH" value="${APP_HOME}/logs"/>
	<property name="DEBUG_LOG_FILE" value="${LOG_HOME_PATH}/debug/${APP_NAME}_debug" />
	<property name="FILE_LOG_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} ${LOG_LEVEL_PATTERN:-%5p} ${PID:- } --- [%t] %-40.40logger{39} : %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}" />


	<appender name="DEBUG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
		<encoder>
			<pattern>${FILE_LOG_PATTERN}</pattern>
		</encoder>

		<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
			<FileNamePattern>${DEBUG_LOG_FILE}.%d{yyyy-MM-dd}.log</FileNamePattern>
			<MaxHistory>60</MaxHistory>
		</rollingPolicy>

		<filter class="ch.qos.logback.classic.filter.LevelFilter">
			<level>DEBUG</level>
			<onMatch>ACCEPT</onMatch>
			<onMismatch>DENY</onMismatch>
		</filter>
	</appender>
	<root level="INFO">
		<appender-ref ref="DEBUG_FILE" />
	</root>

	<logger name="com.mingrn.logback" level="DEBUG">
		<appender-ref ref="DEBUG_FILE"/>
	</logger>

	<logger name="com.mingrn.logback.repository" level="DEBUG" />
</configuration>

тег конфигурации

configurationПринадлежит метке глобальной конфигурации, в конфигурацииlogbackПри регистрации все свойства конфигурации должны быть включены в этот тег конфигурации! Тег конфигурации имеет в общей сложности четыре атрибута узла.

scan

По умолчанию: файл конфигурации будет сканироваться на наличие изменений каждую минуту, файл конфигурации будет перезагружен, если он изменится, значение по умолчанию — true (Описание официального сайта)

<configuration scan="true"> 
  <!--do something-->
</configuration>

scanPeriod

Период сканирования конфигурационного файла, когда единица измерения не задана, по умолчанию миллисекунды. может сотрудничатьscanиспользуется при включенииscanПри установке этого значения оно используется для управления циклом сканирования файла конфигурации, например сканирование файла конфигурации каждые 30 секунд (Описание официального сайта)

<configuration scan="true" scanPeriod="30 seconds" > 
  <!--do something-->
</configuration>

###packagingData

Включить ли упаковку данных в трассировке стека, по умолчанию — false. Если установлено значение TRUE, распечатать информацию о данных стека (Описание официального сайта)

<configuration packagingData="true">
  <!--do something-->
</configuration>

Журнал выглядит следующим образом

14:28:48.835 [btpool0-7] INFO  c.q.l.demo.prime.PrimeAction - 99 is not a valid value
java.lang.Exception: 99 is invalid
  at ch.qos.logback.demo.prime.PrimeAction.execute(PrimeAction.java:28) [classes/:na]
  at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:431) [struts-1.2.9.jar:1.2.9]
  at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:236) [struts-1.2.9.jar:1.2.9]
  at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:432) [struts-1.2.9.jar:1.2.9]
  at javax.servlet.http.HttpServlet.service(HttpServlet.java:820) [servlet-api-2.5-6.1.12.jar:6.1.12]
  at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:502) [jetty-6.1.12.jar:6.1.12]
  at ch.qos.logback.demo.UserServletFilter.doFilter(UserServletFilter.java:44) [classes/:na]
  at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1115) [jetty-6.1.12.jar:6.1.12]
  at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:361) [jetty-6.1.12.jar:6.1.12]
  at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:417) [jetty-6.1.12.jar:6.1.12]
  at org.mortbay.jetty.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:230) [jetty-6.1.12.jar:6.1.12]

debug

Просмотр состояния выполнения журнала в режиме реального времени Значение по умолчанию — false. Если установлено значение TRUE, внутренняя информация журнала обратного входа будет распечатана, а состояние выполнения журнала можно будет просмотреть в режиме реального времени. (Описание официального сайта)

<configuration debug="true"> 
	<include resource="org/springframework/boot/logging/logback/base.xml" />
</configuration>

Метка прослушивателя состояния

statusListenerДочерний элемент конфигурации. Является прослушивателем состояния путем регистрации прослушивателя состояния, чтобы можно было предпринять немедленные действия в ответ на сообщения о состоянии, особенно сообщения, которые появляются после настройки журнала. Регистрация прослушивателя состояния — это удобный способ отслеживать внутреннее состояние логбэка без вмешательства человека (Описание официального сайта)

<configuration>
  <statusListener class="ch.qos.logback.core.status.OnConsoleStatusListener" />  

  <!--do something-->
</configuration>

тег регистратора

<logger>Дочерний элемент конфигурации. Используется для установки вывода журнала пакета или определенного класса и указания<appender> , loggerИспользуйте только одно имя,levelи необязательныйaddtivityАтрибуты(Описание официального сайта)

name

nameатрибуты используются для указанияloggerОграниченный пакет или конкретный класс.

<!--指定包-->
<logger name="com.mingrn.repository"/>
<!--指定类-->
<logger name="com.mingrn.repository.UserRepository"/>

level

levelСвойство задает уровень печати журнала. TRACE, DEBUG, INFO, WARN, ERROR, ALL и OFF, а также специальное значение INHERITED или синоним NULL представляют уровень, на котором применяется вышестоящий уровень. Если это свойство не установлено, текущий регистратор наследует вышестоящий уровень (корневой).

<!--指定包-->
<logger name="com.mingrn.repository" level="DEBUG"/>
<!--指定类-->
<logger name="com.mingrn.repository.UserRepository" level="DEBUG"/>

addtivity

addtivityСледует ли передавать информацию о печати вышестоящему регистратору, значение по умолчанию — true. и если здесь установлено значение true

<logger name="com.mingrn.repository" level="DEBUG" additivity="true"/>

При выводе журнала вы обнаружите, что консоль будет выводить обе стороны, потому что это свойство установлено. Так вообще укажите<logger>Это свойство имеет значение FALSE, если указан пакет или конкретный класс.

<logger name="com.mingrn.repository" level="DEBUG" additivity="true"/>
	
<root level="INFO">
    <appender-ref ref="CONSOLE" />
	<appender-ref ref="DEBUG_FILE" />
	<appender-ref ref="INFO_FILE" />
	<appender-ref ref="WARN_FILE" />
	<appender-ref ref="ERROR_FILE" />
	<appender-ref ref="RUN_FILE" />
</root>

корневой тег

<root>Дочерний элемент конфигурации. Этикетка на самом деле<logger>, но он корень<logger>. Тег имеет только один атрибутlevelто есть уровень журнала печати. как<logger >или<appender>Когда метка установлена ​​на выходной уровень, она унаследует уровень, установленный меткой по умолчанию! При этом, если установлено<logger >после иadditivityКогда установлено значение true, проход заставит регистратор распечатать журнал, а затем корень снова распечатает журнал! (Описание официального сайта)

тег appender-ref

<appender-ref>Дочерний элемент корня или регистратора. Этикетка принадлежитloggerиrootВнутренняя справочная этикетка. Тег имеет только один атрибутrefиспользуется для указания<appender>помеченnameценность! это обозначеноappenderВыходной уровеньroot,loggerуказанный уровень, еслиappenderВывод только после указанного уровняappenderУказанный уровень ведения журнала.

<root level="INFO">
    <appender-ref ref="CONSOLE" />
	<appender-ref ref="DEBUG_FILE" />
	<appender-ref ref="INFO_FILE" />
	<appender-ref ref="WARN_FILE" />
	<appender-ref ref="ERROR_FILE" />
	<appender-ref ref="RUN_FILE" />
</root>

<logger name="com.uhope.rl.electornic" level="DEBUG">
	<appender-ref ref="DEBUG_FILE"/>
</logger>

ref

указать конкретноеappender.refзначение<appender>изnameзначение атрибута

<logger name="com.uhope.rl.electornic" level="DEBUG">
	<appender-ref ref="DEBUG_FILE"/>
</logger>
<appender name="DEBUG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
	<!--do something-->
</appender>

тег contextName

<contextName>: дочерний элемент конфигурации. Используется для определения контекста, с которым связан логер Имя контекста по умолчанию — default. Однако этой метке можно присвоить другие имена, чтобы различать записи разных эталонных программ.После установки ее нельзя изменить.

Описание официального сайта

<configuration>
  <contextName>myAppName</contextName>
  <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
      <pattern>%d %contextName [%t] %level %logger{36} - %msg%n</pattern>
    </encoder>
  </appender>

  <root level="debug">
    <appender-ref ref="STDOUT" />
  </root>
</configuration>

тег свойства

<property>Дочерний элемент конфигурации. является тегом атрибута.

Описание официального сайта

определение значения

<configuration debug="true">
	<!--路径-->
	<property name="USER_HOME" value="/home/sebastien" />
	<!--日志输出规则-->
	<property name="FILE_LOG_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} ${LOG_LEVEL_PATTERN:-%5p} ${PID:- } --- [%t] %-40.40logger{39} : %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}" />

	<appender name="FILE" class="ch.qos.logback.core.FileAppender">
		<file>${USER_HOME}/myApp.log</file>
		<encoder>
			<pattern>%msg%n</pattern>
		</encoder>
	</appender>

	<appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
		<encoder>
			<pattern>${FILE_LOG_PATTERN}</pattern>
		</encoder>
	</appender>
</configuration>

Цитирование ресурсов

<configuration>

  <property resource="resource.properties" />

  <appender name="FILE" class="ch.qos.logback.core.FileAppender">
     <file>${USER_HOME}/myApp.log</file>
     <encoder>
       <pattern>%msg%n</pattern>
     </encoder>
   </appender>

   <root level="debug">
     <appender-ref ref="FILE" />
   </root>
</configuration>

Справочные материалы

variable.properties — это файл

содержание документа:USER_HOME=/home/sebastien

<configuration>

  <property file="src/main/java/chapters/configuration/variables.properties" />

  <appender name="FILE" class="ch.qos.logback.core.FileAppender">
     <file>${USER_HOME}/myApp.log</file>
     <encoder>
       <pattern>%msg%n</pattern>
     </encoder>
   </appender>

   <root level="debug">
     <appender-ref ref="FILE" />
   </root>
</configuration>

тег добавления

appenderДочерний элемент конфигурации. На самом деле этоlogger, но это компонент, отвечающий за запись логов. Компонент применяет два значения свойств:nameиclass.

  • name: имя аппендера, это значение в основном используется для<appender-ref>изref.
  • class: Определите права добавления для имени или вызова компонента!

описание ключа группы добавления

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

  • Местные, такие как:ConsoleAppender,FileAppender...
  • Удаленные, такие как:SocketAppender,SSLSocketAppender

ConsoleAppenderпервичный ключ

Описание официального сайта ConsoleAppender

Класс пакета компонента ConsoleAppender:ch.qos.logback.core.ConsoleAppenderОсновная функция ConsoleAppender — вывод логов в консоль, что подходит дляместный.

Имеет следующие свойства узла

Имя свойства тип инструкция
encoder Encoder кодирование
target String System.out или System.err , по умолчанию System.out
withJansi boolean Атрибут jansi по умолчанию имеет значение false. Установка для Jansi значения true активирует библиотеку Jansi, которая обеспечивает поддержку цветовых кодов ANSI на компьютерах с Windows.
<configuration>

  <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <!-- encoders are assigned the type -->
    <!-- ch.qos.logback.classic.encoder.PatternLayoutEncoder by default -->
    <encoder>
      <pattern>%-4relative [%thread] %-5level %logger{35} - %msg %n</pattern>
    </encoder>
  </appender>

  <root level="DEBUG">
    <appender-ref ref="STDOUT" />
  </root>
</configuration>

FileAppenderгрупповой ключ

Описание официального сайта FileAppender

Класс пакета компонента FileAppenderch.qos.logback.core.FileAppenderОсновная функция FileAppender — запись логов в файл. Целевой файл задается параметром файла. Если файл уже существует, он либо добавляется, либо усекается в зависимости от значения добавленного атрибута, подходящего дляместный.

Имеет следующие свойства узла

Имя свойства тип инструкция
file String Записываемое имя файла может быть относительным или абсолютным каталогом.Если каталог верхнего уровня не существует, он будет создан автоматически, и значение по умолчанию отсутствует.
append boolean Если установлено значение true, журнал будет увеличиваться в конце файла. Если false, то очистите существующие файлы. По умолчанию истинно
encoder String кодирование
prudent boolean Запишите журнал в указанный файл безопасно и незаметно, даже если есть другие FileAppenders, которые также записывают журнал в этот файл. Неэффективный, этот режим по умолчанию имеет значение false. Примечание: когда для этого значения установлено значение true, для добавления по умолчанию будет установлено значение true.

инструкцияПо умолчанию журналы немедленно записываются в базовый выходной поток. Это значение по умолчанию является безопасным, поскольку журнал имен не теряется, если приложение закрывается без надлежащего завершения работы. Однако, чтобы значительно увеличить пропускную способность журналов,<immediateFlush>Displayed имеет значение false.

<configuration>

  <appender name="FILE" class="ch.qos.logback.core.FileAppender">
    <file>testFile.log</file>
    <append>true</append>
    <!-- 为了更高的日志吞吐量应将 immediateFlush 设为 false -->
    <immediateFlush>true</immediateFlush>
    <!-- encoders are assigned the type -->
    <!-- ch.qos.logback.classic.encoder.PatternLayoutEncoder by default -->
    <encoder>
      <pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern>
    </encoder>
  </appender>
        
  <root level="DEBUG">
    <appender-ref ref="FILE" />
  </root>
</configuration>

RollingFileAppenderгрупповой ключ

Описание официального сайта RollingFileAppender

Класс пакета компонента RollingFileAppenderch.qos.logback.core.rolling.RollingFileAppenderRollingFileAppender расширяет FileAppender. При выполнении определенных условий он имеет функцию прокрутки для записи файлов. Говорят, что это наиболее часто используемое разрешение на запись файла, подходящее дляместный. Этот компонент состоит из двух очень важных компонентов:RollingPolicyиTriggeringPolicy

Имеет следующие свойства узла

Имя свойства тип инструкция
file String Записываемое имя файла может быть относительным или абсолютным каталогом.Если каталог верхнего уровня не существует, он будет создан автоматически, и значение по умолчанию отсутствует.
append boolean Если установлено значение true, журнал будет увеличиваться в конце файла. Если false, то очистите существующие файлы. По умолчанию истинно
encoder String кодирование
prudent boolean Запишите журнал в указанный файл безопасно и незаметно, даже если есть другие FileAppenders, которые также записывают журнал в этот файл. Неэффективный, этот режим по умолчанию имеет значение false. Примечание: когда для этого значения установлено значение true, для добавления по умолчанию будет установлено значение true.
rollingPolicy RollingPolicy Политика непрерывного удаления определяет поведение RollingFileAppender, включая перемещение и переименование файлов.увидеть ниже
triggeringPolicy TriggeringPolicy Скажите RollingFileAppender активировать прокрутку соответствующим образом.увидеть ниже

RollingFileAppenderгрупповой ключRollingPolicyстратегия пролонгации

Описание официального сайта RollingPolicy

Политика прокрутки RollingPolicy отвечает за пути к файлам и переименование или наименование во время прокрутки.

RollingPolicyперевернутая стратегияTimeBasedRollingPolicyстратегия пролонгации

Класс пакета TimeBasedRollingPolicych.qos.logback.core.rolling.TimeBasedRollingPolicyПолитика пролонгации TimeBasedRollingPolicy, вероятно, является самой популярной политикой пролонгации. Он определяет стратегии пролонгации на основе времени, такие как день, месяц и т. д.! TimeBasedRollingPolicy имеет обязательное свойство<fileNamePattern>и несколько необязательных свойств.

Имеет следующие свойства узла

Имя свойства тип инструкция
fileNamePattern String обязательный атрибут, значение которого должно включать имя файла с правильно размещенным спецификатором преобразования %d. Спецификатор преобразования %d может содержатьjava.text.SimpleDateFormatУкажите шаблон даты и времени, например %d{гггг-ММ}. Если шаблон даты и времени, такой как %d, опущен, формат времени по умолчанию — гггг-ММ-дд. Период переноса выводится из значения fileNamePattern.
maxHistory int Максимальное время хранения для количества журналов, таких как установленный режим времени (fileNamePattern) — гггг-ММ, а для параметра maxHistory установлено значение 6. Это означает, что файлы журналов хранятся не более 6 месяцев. Обратите внимание, что при удалении старых заархивированных файлов журнала все папки, созданные для архивирования файлов журнала, будут соответствующим образом удалены.
maxFileSize int Максимальный размер сохранения каждого файла, например 10M, 100M
totalSizeCap int Контролируйте общий размер хранилища файлов журнала, например 3 ГБ, 100 МБ.
cleanHistoryOnStart boolean Выполните удаление архива при запуске приложения, установив для очистки истории значение true. По умолчанию ложь

Список значений TimeBasedRollingPolicy fileNamePattern:

fileNamePattern Rollover schedule file
/wombat/foo.%d По умолчанию: гггг-ММ-дд выбирается ежедневно. /ставим/foo.2018-6-1, /ставим/foo.2018-6-2
/wombat/%d{yyyy/MM}/foo.txt скользящий ежемесячно /вомбат/2018/1/foo.txt , /вомбат/2018/2/foo.txt
/wombat/foo.%d{yyyy-ww}.log еженедельно
/wombat/foo%d{yyyy-MM-dd_HH}.log пролистывать каждый раз
/wombat/foo%d{yyyy-MM-dd_HH-mm}.log Рулон в минуту
/wombat/foo.%d.gz Ежедневная прокрутка, автоматически сжатая в формат GZIP /wombat/foo.2018-6-1.gz

Установите максимальное время хранения журнала и максимальную емкость<file>logFile.log</file>не может быть установлен

<configuration>
  <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
  
    <file>logFile.log</file>
    
    <encoder>
      <pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern>
    </encoder>
    
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
      <!-- daily rollover -->
      <fileNamePattern>logFile.%d{yyyy-MM-dd}.log</fileNamePattern>

      <!-- keep 30 days' worth of history capped at 3GB total size -->
      <maxHistory>30</maxHistory>
      <totalSizeCap>3GB</totalSizeCap>

    </rollingPolicy>
  </appender> 

  <root level="DEBUG">
    <appender-ref ref="FILE" />
  </root>
  
</configuration>

Разрешить нескольким программам записывать в один и тот же файл журнала

<configuration>
  <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <!-- Support multiple-JVM writing to the same log file -->
    <prudent>true</prudent>
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
      <fileNamePattern>logFile.%d{yyyy-MM-dd}.log</fileNamePattern>
      <maxHistory>30</maxHistory> 
      <totalSizeCap>3GB</totalSizeCap>
    </rollingPolicy>

    <encoder>
      <pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern>
    </encoder>
  </appender> 

  <root level="DEBUG">
    <appender-ref ref="FILE" />
  </root>
</configuration>

Установите максимальный размер каждого файла для сохранения

<configuration>
  <appender name="ROLLING" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>mylog.txt</file>
    <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
      <!-- rollover daily -->
      <fileNamePattern>mylog-%d{yyyy-MM-dd}.%i.txt</fileNamePattern>
       <!-- each file should be at most 100MB, keep 60 days worth of history, but at most 20GB -->
       <maxFileSize>100MB</maxFileSize>    
       <maxHistory>60</maxHistory>
       <totalSizeCap>20GB</totalSizeCap>
    </rollingPolicy>
    <encoder>
      <pattern>%msg%n</pattern>
    </encoder>
  </appender>

  <root level="DEBUG">
    <appender-ref ref="ROLLING" />
  </root>

</configuration>
RollingPolicyперевернутая стратегияFixedWindowRollingPolicyстратегия пролонгации

Класс пакета FixedWindowRollingPolicych.qos.logback.core.rolling.FixedWindowRollingPolicyFixedWindowRollingPolicy переименовывает файлы в соответствии с алгоритмом фиксированного окна при прокрутке FixedWindowRollingPolicy имеет обязательное свойство<fileNamePattern>и несколько необязательных свойств.

Имеет следующие свойства узла

Имя свойства тип инструкция
fileNamePattern String обязательный атрибут, этот параметр указывает, что при переименовании файлов журналов будет использоваться шаблон FixedWindowRollingPolicy. Он должен содержать строку %i, указывающую, куда вставить текущее значение индекса окна. Например, MyLogFile%i.log создаст файлы MyLogFile1.log, MyLogFile2.log и MyLogFile3.log с минимальным индексом 1 и максимальным индексом 3.
minIndex int минимальный индекс
maxIndex int максимальный индекс

Перечисление значения TimeBasedRollingPolicy fileNamePattern

Number of rollovers Active output target Archived log files file
0 foo.log - Нет файлов прокрутки, журнал будет записывать исходный файл
1 foo.log foo1.log При первом смене файл foo.log будет называться foo1.log, а новый файл foo.log будет создан и станет активной целью вывода.
2 foo.log foo1.log, foo2.лог При втором переносе файл foo1.log будет называться foo2.log, файл foo.log будет называться foo1.log, а новый файл foo.log будет создан и станет активной целью вывода.
3 foo.log foo1.log, foo2.log, foo3.log То же
4 foo.log foo1.log, foo2.log, foo3.log, foo4.log То же
<configuration>
  <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>test.log</file>

    <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
      <fileNamePattern>tests.%i.log.zip</fileNamePattern>
      <minIndex>1</minIndex>
      <maxIndex>3</maxIndex>
    </rollingPolicy>

    <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
      <maxFileSize>5MB</maxFileSize>
    </triggeringPolicy>
    <encoder>
      <pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern>
    </encoder>
  </appender>
        
  <root level="DEBUG">
    <appender-ref ref="FILE" />
  </root>
</configuration>

RollingFileAppenderгрупповой ключtriggeringPolicyтриггерная стратегия

Описание официального сайта triggeringPolicy

Реализация инициирующей политики RollingPolicy отвечает за указание RollingFileAppender, когда нужно выполнить пролонгацию.

triggeringPolicyтриггерная стратегияSizeBasedTriggeringPolicyтриггерная стратегия

Описание официального сайта триггерной политики SizeBasedTriggeringPolicy

Класс пакета SizeBasedTriggeringPolicych.qos.logback.core.rolling.SizeBasedTriggeringPolicySizeBasedTriggeringPolicy Просмотрите размер текущего активного файла, если он превышает указанный размер, он сообщит RollingFileAppender, чтобы активировать текущий активный файл. Политика срабатывания SizeBasedTriggeringPolicy принимает только один атрибутmaxFileSize, значение по умолчанию — 10 МБ.maxFileSizeПараметры можно указать в байтах, килобайтах, мегабайтах или гигабайтах, установив значения в КБ, МБ и ГБ соответственно. Например, 5000000, 5000 КБ, 5 МБ и 2 ГБ являются допустимыми значениями, а первые три эквивалентны.

<configuration>
  <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>test.log</file>
    <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
      <fileNamePattern>test.%i.log.zip</fileNamePattern>
      <minIndex>1</minIndex>
      <maxIndex>3</maxIndex>
    </rollingPolicy>

    <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
      <maxFileSize>5MB</maxFileSize>
    </triggeringPolicy>
    <encoder>
      <pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern>
    </encoder>
  </appender>
        
  <root level="DEBUG">
    <appender-ref ref="FILE" />
  </root>
</configuration>

SocketAppender and SSLSocketAppenderгрупповой ключ

Описание официального сайта SocketAppender и SSLSocketAppender

Класс пакета SocketAppenderch.qos.logback.classic.net.SocketAppenderКласс пакета SSLSocketAppenderch.qos.logback.classic.net.SSLSocketAppender

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

Именование разрешений SocketAppender и SSLSocketAppender в основном применимо к удаленным. Упомянутое выше назначение полномочий в основном предназначено для записи журнала на локальном компьютере текущего сервера. Разрешения SocketAppender и SSLSocketAppender могут отлично записывать журналы на удаленный компьютер.

SocketAppender может записывать журналы на удаленные машины главным образом потому, что SocketAppender предназначен для передачи сериализованных данных по сети.журнал событийТело (не знаю, что тут сказать) сущность. События журнала отправляются в открытом виде при использовании SocketAppender по сети. Однако, когда мы используем SSLSocketAppender, журналы будут отправляться по защищенному каналу. Сериализованный тип объектаLoggingEventVO, он достигаетILoggingEventинтерфейс.

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

SocketAppender работает поверх уровня протокола управления передачей (TCP), который обеспечивает надежный, упорядоченный сквозной поток октетов с контролируемым потоком. Поэтому, если удаленный сервер доступен, события журнала в конечном итоге попадут туда. В противном случае, если удаленный сервер выйдет из строя или станет недоступен, события журнала будут просто удалены. Если сервер перезапущен, передача событий будет возобновлена ​​прозрачно. Это прозрачное переподключение выполняется потоком соединителя, который периодически пытается подключиться к серверу.

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

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

Чтобы избежать этой проблемы со сборкой мусора, SocketAppender следует закрыть явно. Долгосрочные приложения, создающие и уничтожающие множество экземпляров SocketAppender, должны знать об этой проблеме сборки мусора. Большинство других приложений могут спокойно его игнорировать. Если JVM, на которой размещается SocketAppender, завершает работу до того, как SocketAppender будет закрыт, явно или посредством последующей сборки мусора, непереданные данные могут быть потеряны в конвейере. Это распространенная проблема с системами на базе Windows.

Чтобы избежать потери данных, обычно перед выходом из приложения, socketAppender можно закрыть явно или вызвав метод остановки красного контекста.

Удаленные серверы идентифицируются по параметрам remoteHost и port. Свойства SocketAppender перечислены в таблице ниже. SSLSocketAppender поддерживает ряд дополнительных свойств конфигурации, подробно описанных ниже.

Имеет следующие свойства узла

Имя свойства тип инструкция
port int порт удаленного сервера
remoteHost String имя удаленного сервера
ssl SSLConfiguration Поддерживается только SSLSocketAppender, это свойство предоставляет конфигурацию SSL, которая будет использоваться приложением, см.:Официальный сайт SSL
includeCallerData boolean Если true, данные вызывающего абонента будут доступны удаленному хосту. По умолчанию данные о вызывающем абоненте не отправляются на сервер.
reconnectionDelay Duration строка задержки продолжительности, например10 secondsУказывает время ожидания между каждой неудачной попыткой подключения к серверу. Значение по умолчанию для этого параметра составляет 30 секунд. Установка для этого параметра значения 0 отключает функцию повторного подключения. Обратите внимание, что поток соединителя не отображается, если соединение с сервером установлено успешно.
queueSize int целое число больше 0Указывает количество событий журнала, которые необходимо сохранить для удаленных получателей. Когда размер очереди равен 1, доставка событий удаленным получателям является синхронной. Когда размер очереди больше 1, новые события помещаются в очередь, если в столбце есть свободное место. Использование длины очереди больше 1 может повысить производительность за счет устранения задержек, вызванных временными сетевыми задержками. Ссылаться наeventDelayLimitАтрибуты
eventDelayLimit Duration строки длительности, такие как10 seconds. Он представляет собой время ожидания перед удалением события, если локальная очередь заполнена, т. е. уже содержит события в очереди. Это может произойти, если удаленный хост продолжает медленно принимать события. Значение по умолчанию для этого параметра составляет 100 миллисекунд.

Параметры сервера журналов

Стандартный дистрибутив Logback Classic включает два сервера, которые можно использовать для получения событий журнала от SocketAppender или SSLSocketAppender.

  • ServerSocketReceiver
  • SimpleSocketServer

SocketAppenderкомпонентовSimpleSocketServer

Описание официального сайта SimpleSocketServer

Приложение SimpleSocketServer принимает два аргумента командной строки:portиconfigFileпорт - это порт для прослушивания,configFileпредставляет собой скрипт конфигурации в формате XML.

<configuration>
          
  <appender name="SOCKET" class="ch.qos.logback.classic.net.SocketAppender">
    <remoteHost>${host}</remoteHost>
    <port>${port}</port>
    <reconnectionDelay>10000</reconnectionDelay>
    <includeCallerData>${includeCallerData}</includeCallerData>
  </appender>

  <root level="DEBUG">
    <appender-ref ref="SOCKET" />
  </root>  

</configuration>

SSLSocketAppenderкомпонентовSimpleSSLSocketServer

Описание официального сайта SimpleSSLSocketServer

SimpleSSLSocketServer требует, чтобы порт, используемый SimpleSocketServer, совпадал с параметром командной строки configFile. Кроме того, вы должны указать местоположение и пароль сертификата сервера журналов x.509, используя системные свойства, указанные в командной строке.

Сервер настроен с помощью параметра debug="true", указанного в корневом элементе, и конфигурацию SSL, которая будет использоваться, можно увидеть в журнале запуска сервера. Это помогает убедиться, что локальные политики безопасности реализованы правильно!

<configuration debug="true">
          
  <appender name="SOCKET" class="ch.qos.logback.classic.net.SSLSocketAppender">
    <remoteHost>${host}</remoteHost>
    <port>${port}</port>
    <reconnectionDelay>10000</reconnectionDelay>
    <ssl>
      <trustStore>
        <location>${truststore}</location>
        <password>${password}</password>
      </trustStore>
    </ssl>
  </appender>

  <root level="DEBUG">
    <appender-ref ref="SOCKET" />
  </root>  

</configuration>	

ServerSocketAppender and SSLServerSocketAppenderкомпоненты

Описание официального сайта ServerSocketAppender и SSLServerSocketAppender

Класс пакета ServerSocketAppenderch.qos.logback.classic.net.server.ServerSocketAppenderКласс пакета SSLServerSocketAppenderch.qos.logback.classic.net.server.SSLServerSocketAppender

SocketAppenderиSSLSocketAppenderКомпонент предназначен для подключения приложения к удаленному серверу журналов по сети с целью доставки событий журнала на сервер. В некоторых случаях может оказаться неудобным или невозможным, чтобы приложение инициировало соединение с удаленным сервером журналов. Для этих случаев Logback предоставляетServerSocketAppender

  • ServerSocketAppender: пассивно прослушивает сокет TCP, ожидая подключения от удаленных клиентов. События журнала рассылаются каждому подключенному клиенту. События журнала, которые происходят, когда ни один клиент не подключен, немедленно отбрасываются.
  • SSLSocketAppender: Рассылает события журнала каждому подключенному клиенту, используя безопасный зашифрованный канал. Кроме того, приложения с поддержкой SSL полностью поддерживают аутентификацию на основе сертификатов, которую можно использовать для обеспечения того, чтобы только авторизованные клиенты могли подключаться к устройству добавления для получения событий регистрации.

ServerSocketAppender, SSLServerSocketAppender имеют следующие атрибуты узла

Имя свойства тип инструкция
address String Адрес локального сетевого интерфейса, на котором приложение будет прослушивать. Если это свойство не указано, приложение будет прослушивать все сетевые интерфейсы.
port int Порт, который прослушивает приложение
includeCallerData boolean Если true, данные вызывающего абонента будут доступны удаленному хосту. По умолчанию данные о вызывающем абоненте не отправляются клиенту.
ssl SSLConfiguration поддерживается толькоSSLServerSocketAppenderкомпонент, это свойство предоставляет конфигурацию SSL, которая будет использоваться приложением

Пример компонента ServerSocketAppender

<configuration debug="true">
  <appender name="SERVER" class="ch.qos.logback.classic.net.server.ServerSocketAppender">
    <port>${port}</port>
    <includeCallerData>${includeCallerData}</includeCallerData>
  </appender>

  <root level="debug">
    <appender-ref ref="SERVER" />
  </root>  

</configuration>

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

Пример компонента SSLServerSocketAppender

<configuration debug="true">
  <appender name="SERVER" class="ch.qos.logback.classic.net.server.SSLServerSocketAppender">
    <port>${port}</port>
    <includeCallerData>${includeCallerData}</includeCallerData>
    <ssl>
      <keyStore>
        <location>${keystore}</location>
        <password>${password}</password>
      </keyStore>
    </ssl>
  </appender>

  <root level="debug">
    <appender-ref ref="SERVER" />
  </root>  

</configuration>

SMTPAppenderкомпоненты

Описание официального сайта SMTPAppender