После прочтения этого логбэк не будет настроен, пожалуйста, ешьте дыню!

задняя часть Spring MyBatis SQL

добревно? Давайте поговорим о slf4jобсуждалось в этой статьеslf4j. Эта статья также начинается с практических примеров, направленных наlogbackконфигурация журнала для обучения.

Введение в логак

официальный сайт logback: https://logback.qos.ch/

Я еще не видел исходный код фреймворка класса журнала, только как его использовать. Так что не говорите об этих "пустых словах". Самое интуитивное восприятие это:

  • logbackиlog4jнаписано одним человеком
  • springbootСреда ведения журнала, используемая по умолчанию,logback.
  • Состоит из трех модулей
    • logback-core
    • logback-classic
    • logback-access
  • Другие о производительности, об использовании памяти, о тестировании и о документации, см. исходный код и описание на официальном сайте.

logback-coreявляется инфраструктурой других модулей, другие модули построены на ней, очевидно,logback-coreПредусмотрены некоторые ключевые общие механизмы.logback-classicСтатус и роль эквивалентныLog4J, что также считаетсяLog4JУлучшенная версия , реализующая простой фасад ведения журнала.SLF4Jlogback-accessв основном какServletМодули для взаимодействия с контейнерами, такие какtomcatилиjetty, предоставляя некоторыеHTTPДоступ к связанным функциям.

Подробный файл конфигурации

Эта часть в основном изучает некоторые элементы конфигурации файла конфигурации журнала.

configuration

Сначала посмотрите на это изображение, эта структура является структурой всего файла конфигурации logback.xml.

Соответственно смотрим конфигурационный файл:

<configuration scan="true" scanPeriod="60 seconds" debug="false">  
    <property name="glmapper-name" value="glmapper-demo" /> 
    <contextName>${glmapper-name}</contextName> 
    
    
    <appender>
        //xxxx
    </appender>   
    
    <logger>
        //xxxx
    </logger>
    
    <root>             
       //xxxx
    </root>  
</configuration>  

ps: если вы хотите использовать поддержку профиля расширения Spring, вам нужно назвать его logback-spring.xml, а другие свойства, такие как свойства, необходимо изменить на springProperty

  • scan: если для этого свойства задано значение true, файл конфигурации будет перезагружен при его изменении Значение по умолчанию — true.
  • scanPeriod: установите временной интервал для контроля за изменением файла конфигурации.Если единица времени не указана, единицей измерения по умолчанию являются миллисекунды. Это свойство вступает в силу, когда для сканирования установлено значение true. Интервал времени по умолчанию составляет 1 минуту.
  • отладка: когда для этого свойства установлено значение true, внутренняя информация журнала logback будет распечатана, а текущий статус logback будет просматриваться в режиме реального времени. Значение по умолчанию неверно.

contextName

каждыйloggerсвязаны сloggerконтекст, имя контекста по умолчанию“default”. но может использоватьcontextNameМетки устанавливаются на другие имена, чтобы различать записи из разных приложений.

property

метки, используемые для определения значений переменных,propertyТег имеет два свойства:nameиvaluenameЗначением является имя переменной,valueзначение, определяемое переменной. пройти черезpropertyОпределенное значение будет вставлено вloggerв контексте. После определения переменной вы можете использовать "${name}" для ее использования. как указано вышеxmlпоказано.

logger

Используется для установки уровня печати журнала пакета или определенного класса и указанияappender.

root

Корневой регистратор также является регистратором и имеет только один атрибут уровня.

appender

Компонент, отвечающий за запись логов, о котором будет подробно рассказано ниже

filter

Фильтр на самом деле является дочерним элементом внутри приложения. Он существует как фильтр, и выполнение фильтра вернет одно из трех значений перечисления: DENY, NEUTRAL и ACCEPT.

  • DENY: журналы будут немедленно удалены без прохождения через другие фильтры.
  • НЕЙТРАЛЬНО: следующий фильтр в упорядоченном списке затем обрабатывает журнал.
  • ПРИНЯТЬ: логи обрабатываются сразу, без прохождения остальных фильтров

анализ случая

Сначала давайте настроим очень простой файл. Подать заявку здесь, я используюlogback-spring.xml. иlogback.xmlсуществуетpropertiesЕсть небольшая разница. Все остальное то же самое.

Инжиниринг: springboot+web

Сначала посмотрите на каталог проекта

В свойствах указывается уровень печати лога и место вывода лога:

#设置应用的日志级别
logging.level.com.glmapper.spring.boot=INFO
#路径
logging.path=./logs

вывод лога из консоли

Конфигурация logback-spring.xml выглядит следующим образом:

<configuration>
    <!-- 默认的控制台日志输出,一般生产环境都是后台启动,这个没太大作用 -->
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <Pattern>%d{HH:mm:ss.SSS} %-5level %logger{80} - %msg%n</Pattern>
        </encoder>
    </appender>
    
    <root level="info">
        <appender-ref ref="STDOUT"/>
    </root>
</configuration>

Контроллер, который печатает журнал

private static final Logger LOGGER =
LoggerFactory.getLogger(HelloController.class);
@Autowired
private TestLogService testLogService;

@GetMapping("/hello")
public String hello(){
    LOGGER.info("GLMAPPER-SERVICE:info");
    LOGGER.error("GLMAPPER-SERVICE:error");
    testLogService.printLogToSpecialPackage();
    return "hello spring boot";
}

Результаты проверки:

01:50:39.633 INFO  com.glmapper.spring.boot.controller.HelloController
- GLMAPPER-SERVICE:info
01:50:39.633 ERROR com.glmapper.spring.boot.controller.HelloController
- GLMAPPER-SERVICE:error

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

Консоль не печатает, а выводит прямо в лог-файл

Сначала посмотрите на файл конфигурации:

<configuration>
    <!-- 属性文件:在properties文件中找到对应的配置项 -->
    <springProperty scope="context" name="logging.path"  source="logging.path"/>
    <springProperty scope="context" name="logging.level" source="logging.level.com.glmapper.spring.boot"/>
    <!-- 默认的控制台日志输出,一般生产环境都是后台启动,这个没太大作用 -->
    <appender name="STDOUT"
        class="ch.qos.logback.core.ConsoleAppender">
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <Pattern>%d{HH:mm:ss.SSS} %-5level %logger{80} - %msg%n</Pattern>
        </encoder>
    </appender>
    
    <appender name="GLMAPPER-LOGGERONE"
    class="ch.qos.logback.core.rolling.RollingFileAppender">
        <append>true</append>
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>${logging.level}</level>
        </filter>
        <file>
            ${logging.path}/glmapper-spring-boot/glmapper-loggerone.log
        </file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <FileNamePattern>${logging.path}/glmapper-spring-boot/glmapper-loggerone.log.%d{yyyy-MM-dd}</FileNamePattern>
            <MaxHistory>30</MaxHistory>
        </rollingPolicy>
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>
    
    <root level="info">
        <appender-ref ref="GLMAPPER-LOGGERONE"/>
    </root>
</configuration>

мы тутappender-refназначенныйappenderдаGLMAPPER-LOGGERONE, потому что не было предыдущего имени дляGLMAPPER-LOGGERONEизappender, чтобы добавитьnameзаGLMAPPER-LOGGERONEизappender.

Обратите внимание на приведенную выше конфигурацию, мы напрямую подключаемсяrootизappender-refназначить непосредственно нашемуGLMAPPER-LOGGERONEэтого приложения. Таким образом, консоль распечатает только баннер и ничего не распечатает, вся информация о запуске будет напечатана в файле журнала.glmapper-loggerone.logсередина.

Но на самом деле мы не хотим, чтобы эти сообщения о запуске включались в мой бизнес-журнал. Итак, в это время нам нужно пройтиloggerЭтикетки делают свое дело. Просто измените указанный выше файл конфигурации:

<logger name="com.glmapper.spring.boot.controller" level="${logging.level}"
        additivity="false">
    <appender-ref ref="GLMAPPER-LOGGERONE" />
</logger>

<root level="${logging.level}">
    <appender-ref ref="STDOUT"/>
</root>

позволятьrootуказать вывод консоли;loggerОтвечает за печать пакетовcom.glmapper.spring.boot.controllerжурнал ниже.

Результаты проверки

Давайте воспользуемся нашим тестовым контроллером для печати журнала в качестве примера, но здесь информация журнала не будет отображаться в консоли. Ожидаемый файл журнала находится в./logs/glmapper-spring-boot/glmapper-loggerone.log.

Отношения между регистратором и приложением

Вышеуказанные два являются базовым методом настройки.В этих двух случаях давайте сначала разберемсяlogger/appender/rootОтношения междуloggerиappenderдетали конфигурации.

Как упоминалось в предыдущем введении,rootэто кореньlogger, так что это одно и то же, толькоrootне может иметь вnameиadditivityсобственность, естьlevel.

appenderЭто компонент печати журнала, который определяет условия фильтрации печати, метод вывода на печать, стратегию прокрутки, метод кодирования, формат печати и т. д. Но это всего лишь компонент печати, если мы не используемloggerилиrootизappender-refуказать конкретноеappender, это не имеет смысла.

следовательноappenderСообщите нашему приложению, как печатать, где печатать и что печатать;loggerОн сообщает приложению, какие из них могут это сделать. Например, журнал под определенным классом может использовать этоappenderПечать или логи под определенным пакетом можно распечатать так.

Подробное объяснение конфигурации приложения

Здесь имя в приведенном выше случаеGLMAPPER-LOGGERONEизappenderинструкция:

<appender name="GLMAPPER-LOGGERONE"
    class="ch.qos.logback.core.rolling.RollingFileAppender">
    <append>true</append>
    <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
        <level>${logging.level}</level>
    </filter>
    <file>
        ${logging.path}/glmapper-spring-boot/glmapper-loggerone.log
    </file>
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
        <FileNamePattern>${logging.path}/glmapper-spring-boot/glmapper-loggerone.log.%d{yyyy-MM-dd}</FileNamePattern>
        <MaxHistory>30</MaxHistory>
    </rollingPolicy>
    <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
        <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
        <charset>UTF-8</charset>
    </encoder>
</appender>

appenderимеет два свойстваnameиclass;nameуточнитьappenderназвание,classуточнитьappenderПолное имя . Вышеприведенное утверждение называетсяGLMAPPER-LOGGERONE,classзаch.qos.logback.core.rolling.RollingFileAppenderодин изappender.

Вид приложения

  • ConsoleAppender: добавить журналы в консоль
  • FileAppender: добавить журнал в файл
  • RollingFileAppender: прокрутка файлов записи, сначала запись журнала в указанный файл, а при выполнении определенного условия запись журнала в другие файлы. Это подкласс FileAppender.

добавить вложенный тег

<append>true</append>

еслиtrue, журнал добавляется в конец файла, если онfalse, чтобы очистить существующие файлы, по умолчаниюtrue.

вложенный тег фильтра

упоминается во введенииfilter; Роль, как указано выше. возможноappenderДобавьте один или несколько фильтров для фильтрации журналов с произвольными условиями.appenderПри наличии нескольких фильтров они выполняются в том порядке, в котором они настроены.

ThresholdFilter

Пороговый фильтр для фильтрации журналов ниже указанного порога. Когда уровень журнала равен или выше критического значения, фильтр возвращаетNEUTRAL; когда уровень журнала ниже критического значения, журнал отклоняется.

<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
    <level>INFO</level>
</filter>

LevelFilter

Фильтр уровня для фильтрации на основе уровня журнала. Если уровень журнала равен настроенному уровню, фильтр будет основан наonMath(для настройки действий, соответствующих фильтру) иonMismatch(Используется для настройки действий, которые не соответствуют критериям фильтра) Принять или отклонить журналы.

<filter class="ch.qos.logback.classic.filter.LevelFilter">   
  <level>INFO</level>   
  <onMatch>ACCEPT</onMatch>   
  <onMismatch>DENY</onMismatch>   
</filter> 

оNEUTRAL,ACCEPT,DENYСм. выше во введении оfilterвведение.

вложенный тег файла

fileМетка используется для указания имени записываемого файла, который может быть относительным или абсолютным каталогом.Если каталог верхнего уровня не существует, он будет создан автоматически, и значение по умолчанию отсутствует.

<file>
    ${logging.path}/glmapper-spring-boot/glmapper-loggerone.log
</file>

Это указывает на то, что текущий присоединитель будет записывать журнал в${logging.path}/glmapper-spring-boot/glmapper-loggerone.logв этом каталоге.

вложенный тег RollingPolicy

Этот вложенный тег используется для описания стратегии прокрутки. только этоappenderизclassдаRollingFileAppenderтребуется конфигурация. Это также включает перемещение и переименование файлов (a.log->a.log.2018.07.22).

TimeBasedRollingPolicy

Наиболее часто используемая стратегия прокатки, она формулирует стратегию прокатки в зависимости от времени, которое отвечает как за прокатку, так и за начало прокатки. Это включает в себя еще два свойства ниже:

  • FileNamePattern
  • maxHistory
<rollingPolicy 
    class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
    <!--日志文件输出的文件名:按天回滚 daily -->
    <FileNamePattern>
        ${logging.path}/glmapper-spring-boot/glmapper-loggerone.log.%d{yyyy-MM-dd}
    </FileNamePattern>
    <!--日志文件保留天数-->
    <MaxHistory>30</MaxHistory>
</rollingPolicy>

Приведенная выше конфигурация показывает, чтоСоздавайте файл журнала каждый день и сохраняйте файл журнала в течение 30 дней.

FixedWindowRollingPolicy

Стратегия прокрутки для переименования файлов в соответствии с алгоритмом фиксированного окна.

вложенная вкладка энкодера

Форматирование событий регистрации. Он делает две вещи:

  • Преобразование информации журнала в массив байтов
  • записать массив байтов в выходной поток
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
    <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50}
    - %msg%n</pattern>
    <charset>UTF-8</charset>
</encoder>

В настоящее времяencoderТолькоPatternLayoutEncoderтип.

Определите приложение, которое печатает только журналы на уровне ошибок

 <!-- 错误日志 appender : 按照每天生成日志文件 -->
<appender name="ERROR-APPENDER" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <append>true</append>
    <!-- 过滤器,只记录 error 级别的日志 -->
    <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
        <level>error</level>
    </filter>
    <!-- 日志名称 -->
    <file>${logging.path}/glmapper-spring-boot/glmapper-error.log</file>
    <!-- 每天生成一个日志文件,保存30天的日志文件 -->
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
        <!--日志文件输出的文件名:按天回滚 daily -->
        <FileNamePattern>${logging.path}/glmapper-spring-boot/glmapper-error.log.%d{yyyy-MM-dd}</FileNamePattern>
        <!--日志文件保留天数-->
        <MaxHistory>30</MaxHistory>
    </rollingPolicy>
    <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
        <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
        <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
        <!-- 编码 -->
        <charset>UTF-8</charset>
    </encoder>
</appender>

Определите приложение, которое выводит на консоль

<!-- 默认的控制台日志输出,一般生产环境都是后台启动,这个没太大作用 -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
        <Pattern>%d{HH:mm:ss.SSS} %-5level %logger{80} - %msg%n</Pattern>
    </encoder>
</appender>

сведения о конфигурации регистратора

<logger name="com.glmapper.spring.boot.controller"
        level="${logging.level}" additivity="false">
    <appender-ref ref="GLMAPPER-LOGGERONE" />
</logger>

Приведенный выше файл конфигурации описывает:com.glmapper.spring.boot.controllerпод этим пакетом${logging.level}уровень ведения журнала будет использоватьGLMAPPER-LOGGERONEпечатать.loggerЕсть три атрибута и вложенный тег:

  • имя: используется для указания получателяloggerПакет или определенный класс ограничений.
  • уровень: используется для установки уровня печати (TRACE, DEBUG, INFO, WARN, ERROR, ALLиOFF), и значениеINHERITEDили синонимNULL, который представляет уровень, на котором применяется вышестоящий уровень. Если это свойство не установлено, текущийloggerУровень вышестоящего будет унаследован.
  • addtivity: используется для описания того, следует ли идти к вышестоящемуloggerПередайте информацию о печати. По умолчаниюtrue.

appender-refиспользуется для указания конкретногоappenderиз.

Различные случаи печати с изоляцией бревен

В предыдущем примере у нас есть три приложения: одно для указания ограничений пакета, одно для управления уровнями ошибок и одно для консоли. Затем в этом разделе мы будем печатать разные журналы в разные файлы журналов.

Изоляция файла журнала по пакету

В этом примере мы будемcom.glmapper.spring.boot.controllerв выводе журнала наglmapper-controller.log;будетcom.glmapper.spring.boot.serviceв выводе журнала наglmapper-service.log.

<!--打印日志到glmapper-service.log的appender-->
<appender name="GLMAPPER-SERVICE"
          class="ch.qos.logback.core.rolling.RollingFileAppender">
    <append>true</append>
    <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
        <level>${logging.level}</level>
    </filter>
    <file>
        ${logging.path}/glmapper-spring-boot/glmapper-service.log
    </file>
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
        <FileNamePattern>${logging.path}/glmapper-spring-boot/glmapper-service.log.%d{yyyy-MM-dd}</FileNamePattern>
        <MaxHistory>30</MaxHistory>
    </rollingPolicy>
    <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
        <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
        <charset>UTF-8</charset>
    </encoder>
</appender>

<!--打印日志到glmapper-controller.log的appender-->
<appender name="GLMAPPER-CONTROLLER"
          class="ch.qos.logback.core.rolling.RollingFileAppender">
    <append>true</append>
    <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
        <level>${logging.level}</level>
    </filter>
    <file>
        ${logging.path}/glmapper-spring-boot/glmapper-controller.log
    </file>
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
        <FileNamePattern>${logging.path}/glmapper-spring-boot/glmapper-controller.log.%d{yyyy-MM-dd}</FileNamePattern>
        <MaxHistory>30</MaxHistory>
    </rollingPolicy>
    <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
        <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
        <charset>UTF-8</charset>
    </encoder>
</appender>

<!--此logger约束将.controller包下的日志输出到GLMAPPER-CONTROLLER,错误日志输出到GERROR-APPENDE;GERROR-APPENDE见上面-->
<logger name="com.glmapper.spring.boot.controller" level="${logging.level}" additivity="false">
    <appender-ref ref="GLMAPPER-CONTROLLER" />
    <appender-ref ref="GERROR-APPENDER" />
</logger>

<!--此logger约束将.service包下的日志输出到GLMAPPER-SERVICE,错误日志输出到GERROR-APPENDE;GERROR-APPENDE见上面-->
<logger name="com.glmapper.spring.boot.service" level="${logging.level}" additivity="false">
    <appender-ref ref="GLMAPPER-SERVICE" />
    <appender-ref ref="GERROR-APPENDER" />
</logger>

увидеть бегущий результат

1, GLMAPER-контроллер

2. glmapper-сервис

3. glmapper-ошибка

Соответствует нашим ожиданиям, но здесь есть небольшая проблема. существуетinfoпоявилось в журналеerror, конечно это нормально. если мы не хотим бытьinfoпоявиться внутриerrorКак это сделать? Очень просто, мы используемAPPENDER-SERVICEНапример,filterФильтр для изменения:

Поставьте следующее:

<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
    <level>${logging.level}</level>
</filter>

изменить на:

<filter class="ch.qos.logback.classic.filter.LevelFilter">
    <level>ERROR</level>
    <!-- 如果命中就禁止这条日志 -->
    <onMatch>DENY</onMatch>  
    <!-- 如果没有命中就使用这条规则 -->
    <onMismatch>ACCEPT</onMismatch>  
</filter>

Здесь также следует отметить, что вloggerсерединаlevelнеобходимо установить наinfoуровень.

Изоляция файла журнала по классам

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

<!--特殊功能单独appender 例如调度类的日志-->
<appender name="SCHEDULERTASKLOCK-APPENDER" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <append>true</append>
    <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
        <level>${logging.level}</level>
    </filter>
    <file>${logging.path}/glmapper-spring-boot/scheduler-task-lock.log</file>
    <!-- 每天生成一个日志文件,保存30天的日志文件 -->
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
        <!--日志文件输出的文件名:按天回滚 daily -->
        <FileNamePattern>${logging.path}/glmapper-spring-boot/scheduler-task-lock.log.%d{yyyy-MM-dd}</FileNamePattern>
        <!--日志文件保留天数-->
        <MaxHistory>30</MaxHistory>
    </rollingPolicy>
    <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
        <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
        <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
        <!-- 编码 -->
        <charset>UTF-8</charset>
    </encoder>
</appender>

<!--这里指定到了具体的某一个类-->
<logger name="com.glmapper.spring.boot.task.TestLogTask" level="${logging.level}" additivity="true">
        <appender-ref ref="SCHEDULERTASKLOCK-APPENDER" />
        <appender-ref ref="ERROR-APPENDER" />
    </logger>

наконец-тоTestLogTaskЖурналы будут распечатаны в этот отдельный файл журнала. Следующее:

Изоляция файла журнала на основе пользовательского имени регистратора

loggerизnameПомимо ограничений классов, пакетов и т.д., конечно, так тоже можно играть. . .

Прежде чем приступить к делу, здесь мы сначала ставим предыдущий случайloggerВыложите заявленный код для сравнения, сTestLogTaskПример лога в классе:

 private static final Logger LOGGER =
 LoggerFactory.getLogger(TestLogTask.class);

существуетgetLoggerв текущем объектеclassВ качестве параметра это должно получить полное имя при печати (см. 3-ниже).

1-2018-07-21 11:15:42.003 [pool-1-thread-1] 
2-INFO  
3-com.glmapper.spring.boot.task.TestLogTask -
4-com.glmapper.spring.boot.task:info

определение бизнес-класса

мы тожеserviceОпределите класс в пакетеTestLogNameServiceImpl

package com.glmapper.spring.boot.service;

@Service("testLogNameService")
public class TestLogNameServiceImpl implements TestLogNameService {

    private static final Logger LOGGER =
    LoggerFactory.getLogger("GLMAPPER-TEST-LOG");

    @Override
    public void print() {
        LOGGER.info("GLMAPPER-TEST-LOG:this is special logger-----info");
        LOGGER.error("GLMAPPER-TEST-LOG:this is special logger-------error");
    }
}

конфигурация приложения и регистратора

<appender name="ROOT-APPENDER" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <append>true</append>
    <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
        <level>${logging.level}</level>
    </filter>
    <file>${logging.path}/glmapper-spring-boot/glmapper-test.log</file>
    <!-- 每天生成一个日志文件,保存30天的日志文件 -->
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
        <!--日志文件输出的文件名:按天回滚 daily -->
        <FileNamePattern>${logging.path}/glmapper-spring-boot/glmapper-test.log.%d{yyyy-MM-dd}
        </FileNamePattern>
        <!--日志文件保留天数-->
        <MaxHistory>30</MaxHistory>
    </rollingPolicy>
    <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
        <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
        <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
        <!-- 编码 -->
        <charset>UTF-8</charset>
    </encoder>
</appender>

<!--这里的name和业务类中的getLogger中的字符串是一样的-->
<logger name="GLMAPPER-TEST-LOG" level="${logging.level}" additivity="true">
        <appender-ref ref="ROOT-APPENDER" />
        <appender-ref ref="ERROR-APPENDER" />
    </logger>

То, что мы ожидали, былоTestLogNameServiceImplЛогин не распечатываетсяglmapper-service.log, вместо этого печатает вglmapper-test.logсередина.

1. glmapper-test.log

2. glmapper-service.log

оправдать наши ожидания.

Как использовать logback для печати оператора sql mybatis

Это все еще довольно сложно. Почему. Взгляните на это:

<settings>
    <setting name="logImpl" value="slf4j" />
</settings>

существуетmybatis-configration.xml, мы используем такой элемент конфигурации для связи с определенным компонентом журнала. ноlogImplреализация неlogbackиз. Так что делать? здесь только черезslf4jпуть к мостуlogback.

Затем настройте следующее в нашем logback-spring.xml:

 <!-- 将sql语句输出到具体的日志文件中 -->
<logger name="com.alipay.sofa.cloudplatform.common.dao" level="${logging.sql.level}" additivity="false">
    <appender-ref ref="SQL-APPENDER"/>
</logger>

Здесь следует отметить несколько моментов. прежде всего${logging.sql.level}Это должна быть отладка, которая определяется самой реализацией mybatis. А вотnameнаборcom.alipay.sofa.cloudplatform.common.daoЗначением является путь к пакету нашего интерфейса dao.

Видел в интернете типичный случай, этот метод может выводить только на консоль, а не выводить файл в лог файл, он ленив по внутреннему механизму реализации.Mybatis использует журнал журналов, чтобы не отображать решение sql.

Суммировать

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

Я собираюсь написать несколько статей о SOFABoot и SpringBoot от Ant Financial, Если вам интересно, вы можете сначала прочитать их.

Портал SOFABoot GitHub