введение
В этой статье будет представлена общая конфигурация журнала, проиллюстрировано значение и использование каждого атрибута тега в соответствии с полным файлом конфигурации, реализованы функции разделения журнала и сохранения журнала, подходящие для производства, и предоставлен полный эффект текущего процесса.
теги конфигурации logback
Давайте сначала представим некоторые часто используемые теги в журнале, чтобы вы могли понять.Структура тегов конфигурации, обычно используемых в журнале, примерно следующая:
-
configuration
Этикетка
configuration
В разделе есть 3 элемента конфигурации
<configuration scan="true" scanPeriod="60 seconds" debug = "true">
scan="true"
Указывает, что конфигурация динамической загрузки включена,scanPeriod
Используется для настройки времени динамической загрузки, если не указаноscan
,scanPeriod
дефолтscan="true" scanPeriod="60 seconds"
, настроитьdebug = "true"
Включите журнал отладки logback, который не включен по умолчанию.
-
property
Этикетка
property
для объявления переменных
<property name="CHARSET" value="UTF-8"/>
Logback также поддерживает чтение элементов конфигурации в файлах конфигурации spring, доступ к которым можно получить черезspringProperty
читать
<springProperty scope="context" name="springAppName"
source="spring.application.name" />
-
appender
Этикетка
appender
это компонент, который выводит события журнала
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>${PATTERN}</pattern>
<charset>${CHARSET}</charset>
</encoder>
</appender>
общийappender
имеют:
ConsoleAppender
Добавить события журнала в консоль
FileAppender
Вывод событий журнала в файл
RollingFileAppender
Поверните файл журнала, когда файл журнала соответствует условиям, выведите журнал в другой файл
-
logger
Этикетка
logger
Используется для установки уровня пакета или класса и указанияappender
<logger name="errorLogger" additivity ="true" level="ERROR">
<appender-ref ref="errorAppender" />
</logger>
additivity
Заявление до высшегоlogger
Пройти информацию о печати, значение по умолчанию верно;appender-ref
Укажите компонент вывода журнала, можно настроить несколько
-
root
Этикетка
<root level="INFO">
<appender-ref ref="STDOUT"/>
</root>
root
Ярлыки всеlogger
высший, если низшийappender
указанныйadditivity="true"
, Нижний уровеньappender
Вывод будет вroot
объявлено вappender
воплощенный в
упражняться
Перейти непосредственно к последней полностью доступной конфигурации
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<springProperty scope="context" name="springAppName"
source="spring.application.name" />
<springProperty scope="context" name="springActive"
source="spring.profiles.active" />
<property name="CHARSET" value="UTF-8"/>
<property name="SAVE_PATH" value="/data/logs/${springAppName}"/>
<property name="PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %X{trackId} [%15.15t] %class{39}.%method[%L] : %m%n"/>
<if condition='property("springActive").equals("prod")'>
<then>
<property name="maxHistory" value="7"/>
</then>
<else>
<property name="maxHistory" value="3"/>
</else>
</if>
<property name="maxFileSize" value="200MB"/>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>${PATTERN}</pattern>
<charset>${CHARSET}</charset>
</encoder>
</appender>
<appender name="digestAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>INFO</level>
</filter>
<file>${SAVE_PATH}/${springAppName}-digest.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${SAVE_PATH}/digest/${springAppName}-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<maxHistory>${maxHistory}</maxHistory>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>${maxFileSize}</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<encoder>
<pattern>${PATTERN}</pattern>
<charset>UTF-8</charset>
</encoder>
<append>true</append>
</appender>
<appender name="bizAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>INFO</level>
</filter>
<file>${SAVE_PATH}/${springAppName}-biz.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${SAVE_PATH}/biz/${springAppName}-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<maxHistory>${maxHistory}</maxHistory>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>${maxFileSize}</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<encoder>
<pattern>${PATTERN}</pattern>
<charset>UTF-8</charset>
</encoder>
<append>true</append>
</appender>
<appender name="statAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>INFO</level>
</filter>
<file>${SAVE_PATH}/${springAppName}-stat.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${SAVE_PATH}/stat/${springAppName}-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<maxHistory>${maxHistory}</maxHistory>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>${maxFileSize}</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<encoder>
<pattern>${PATTERN}</pattern>
<charset>${CHARSET}</charset>
</encoder>
<append>true</append>
</appender>
<appender name="errorAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${SAVE_PATH}/${springAppName}-error.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${SAVE_PATH}/error/${springAppName}-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<maxHistory>${maxHistory}</maxHistory>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>${maxFileSize}</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<encoder>
<pattern>${PATTERN}</pattern>
<charset>${CHARSET}</charset>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<append>true</append>
</appender>
<logger name="digestLogger" additivity ="true">
<appender-ref ref="digestAppender" />
</logger>
<logger name="bizLogger" additivity ="true">
<appender-ref ref="bizAppender" />
</logger>
<logger name="statLogger" additivity ="true">
<appender-ref ref="statAppender" />
</logger>
<logger name="errorLogger" additivity ="true" level="ERROR">
<appender-ref ref="errorAppender" />
</logger>
<logger name = "cn.sleeper" level = "DEBUG"/>
<root level="INFO">
<appender-ref ref="STDOUT"/>
</root>
</configuration>
объяснять
Настройте, как указано выше
-
springProperty
Получите имя приложения из файла конфигурации spring, чтобы назвать журнал, получитеspring.profiles.active
Параметры используются для различения среды выполнения -
property
ОпределенныйCHARSET
Используется для указания кодов дней, определенийSAVE_PATH
Используется для указания пути хранения отчета и определения файла журнала.PATTERN
Укажите формат журнала, определениеmaxHistory
Файлы журнала отказа от ответственности хранят количество дней,maxFileSize
Укажите максимальную емкость каждого лог-файла, это нужно указать, используется logback<if condition...
мнение, нужно добавитьjanino
Зависимость, см. следующее:<dependency> <groupId>org.codehaus.janino</groupId> <artifactId>janino</artifactId> <version>2.6.1</version> </dependency>
-
appender
(1)STDOUT
Тип приложенияConsoleAppender
, в качестве вывода консоли укажите формат журнала вывода консоли и тип кодировки
(2)bizAppender
Тип приложенияRollingFileAppender
, вывод в виде бизнес-журнала
(3)digestAppender
Тип приложенияRollingFileAppender
, как вывод сводного журнала
(4)statAppender
Тип приложенияRollingFileAppender
Как вывод журнала статистики
(5)errorAppender
Тип приложенияRollingFileAppender
, как вывод журнала исключений
в каждом из перечисленныхappender
Определенный<level>
уровень печати журнала, используйтеTimeBasedRollingPolicy
Определите стратегию ротации файлов журнала, укажите имя файла журнала, максимальное время хранения и максимальный размер файла. <encoder>
Определите формат журнала, журнал кодировки,errorAppender
использоватьLevelFilter
фильтрERROR
журнал уровней, всеERROR
уровень журнала доerrorAppender
обработка, неINFO
Журналы уровней будут отфильтрованы и использованы другими приложениями.ThresholdFilter
Значения конфигурации фильтра нижеINFO
журнал уровней
logger
для каждого определенногоappender
, который определяет соответствующийlogger
,использоватьappender-ref
Ассоциация, удобная для разбиения лога в коде,additivity="true"
Указывает, что журнал будет отправлен обратно в корень, а корень определяет приложение вывода консоли, то есть вlogger
объявленadditivity="true"
Не только будет<logger>
сам в аппендер записывается в файл, а так же выводится в консоль
root
level
заданный уровень печатиappender-ref
указанный вывод на консоль дляConsoleAppender
Эффект
В сочетании с вышеуказанным файлом конфигурации мы определяем несколькоlogger
, Таким образом, при использовании необходимо регистрировать уровень инкапсуляции, чтобы его можно было определить в вызове при вызове соответствующего хорошегоappender
компоненты
public interface LogApi {
Logger dlog = LoggerFactory.getLogger("digestLogger");
Logger blog = LoggerFactory.getLogger("bizLogger");
Logger slog = LoggerFactory.getLogger("statLogger");
Logger elog = LoggerFactory.getLogger("errorLogger");
}
Тест печати журнала с использованием LogApi
@RestController
@RequestMapping("/test")
public class LogController {
@GetMapping
public void log() {
blog.trace("测试业务日志 trace");
blog.debug("测试业务日志 debug");
blog.info("测试业务日志 info");
blog.warn("测试业务日志 warn");
blog.error("测试业务日志 error");
elog.trace("测试异常日志 trace");
elog.debug("测试异常日志 debug");
elog.info("测试异常日志 info");
elog.warn("测试异常日志 warn");
elog.error("测试异常日志 error");
slog.trace("测试统计日志 trace");
slog.debug("测试统计日志 debug");
slog.info("测试统计日志 info");
slog.warn("测试统计日志 warn");
slog.error("测试统计日志 error");
dlog.trace("测试摘要日志 trace");
dlog.debug("测试摘要日志 debug");
dlog.info("测试摘要日志 info");
dlog.warn("测试摘要日志 warn");
dlog.error("测试摘要日志 error");
}
}
控制台输出效果
生成的目录结构
biz
Под содержанием
Для тестирования определено разделение по 2 КБ, поэтому, когда файл больше 2 КБ, он будет помещен в настроенный каталог для создания нового файла.
logTest-biz.log
logTest-error.log
Этот пример кода был загруженGitHub.com/Chen Xuan код…