Spring-boot с spring-mybatis - как заставить его регистрировать все SQL-запросы

у меня есть простое приложение spring-boot-mybatis (имейте в виду, пожалуйста). Mybatis-это ведение журнала SQL-запросов только в случае неудачи (на excepions). Скажите, пожалуйста, как заставить его регистрировать все SQL-запросы на консоль ?

в данный момент я использую slf4j logger (автоматически настраивается spring-boot).
Я нахожу эту ссылку:http://www.mybatis.org/mybatis-3/logging.html
однако мне не удалось последовать за ним. Прежде всего конфигурация показана на log4j, и я не уверен, правильно ли я понимаю: достаточно ли настроить в application.properties ?

спасибо заранее

3 ответов


Spring boot использует logback в качестве поставщика журналов по умолчанию для Slf4j. Фабрика журнала Ibatis внутренняя нагружает SLF4j как первый регистратор выбора. Все, что вам нужно сделать, это настроить spring boot logger для публикации сообщений журнала для ibatis mapper.

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

logging.level.org.springframework=WARN
logging.level.com.spring.ibatis.UserMapper=DEBUG
logging.file=logs/spring-boot-logging.log

во второй строке вы определяете запись журнала для ibatis mapper с уровнем журнала отладки. com.spring.ibatis пакета и UserMapper - это образец картограф.

следующие журналы начнут появляться в консоли и в файле spring-boot-logging. Это сообщения журнала, созданные из saveUser и findByName метод ApplicationTest класса.

2016-12-19 22:07:06.358  INFO 7248 --- [main] com.spring.ibatis.ApplicationTest        : Started ApplicationTest in 3.048 seconds (JVM running for 4.209)
2016-12-19 22:07:06.424 DEBUG 7248 --- [main] com.spring.ibatis.UserMapper.saveUser    : ==>  Preparing: insert into users(name) values(?) 
2016-12-19 22:07:06.444 DEBUG 7248 --- [main] com.spring.ibatis.UserMapper.saveUser    : ==> Parameters: ibatis(String)
2016-12-19 22:07:06.445 DEBUG 7248 --- [main] com.spring.ibatis.UserMapper.saveUser    : <==    Updates: 1
2016-12-19 22:07:06.457 DEBUG 7248 --- [main] com.spring.ibatis.UserMapper.findByName  : ==>  Preparing: select name from users WHERE name=? 
2016-12-19 22:07:06.470 DEBUG 7248 --- [main]  com.spring.ibatis.UserMapper.findByName  : ==> Parameters: ibatis(String)
2016-12-19 22:07:06.504 DEBUG 7248 --- [main]  com.spring.ibatis.UserMapper.findByName  : <==      Total: 1

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

вы можете найти полный код с тестовыми примерами Junit на https://github.com/saagar2000/ibatis


SLF4J не заменяет log4j, они работают вместе. Он удаляет зависимость от log4j из вашей библиотеки / приложения.

https://softwareengineering.stackexchange.com/questions/108683/slf4j-vs-log4j-which-one-to-prefer

поэтому хорошо использовать конфигурации log4j, если вы используете slf4j, пока вы используете log4j под slf4j.

вот руководство, которое я нашел, что говорит об использовании slf4j с log4j logger: http://saltnlight5.blogspot.ca/2013/08/how-to-configure-slf4j-with-different.html

по сути вам просто нужно создать файл свойств: src/main/resources/log4j.properties и настройте его так же, как и в вашей ссылке. И как говорит ваша ссылка:

... Для этого операторы SQL регистрируются на уровне отладки (отлично в журнале JDK) и результаты на уровне трассировки (лучше в журнале JDK) ...

поэтому убедитесь, что у вас есть log4j.logger.org.mybatis.example=DEBUG задайте в файле свойств.


альтернативный подход-использовать драйвер прокси, такой как log4jdbc2, который имеет преимущество регистрации точного SQL, идущего в базу данных с параметрами на месте, в отличие от других ответов. Это будет работать независимо от уровня абастракции персистентности (например, iBatis, JPA и т. д.).

https://code.google.com/archive/p/log4jdbc-log4j2/

одним из основных преимуществ этого является то, что вы можете скопировать SQL прямо в свой интерфейс БД и выполнить как есть.

1 Добавить Зависимости Maven:

<dependency>
    <groupId>org.bgee.log4jdbc-log4j2</groupId>
    <artifactId>log4jdbc-log4j2-jdbc4.1</artifactId>
    <version>1.16</version>
</dependency>

2 Добавить конфигурацию logback. Скопируйте соответствующие части в существующий logback.в XML

<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
        <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
        </pattern>
    </encoder>
</appender>

<logger name="jdbc.audit" level="ERROR" />
<logger name="jdbc.connection" level="ERROR" />
<logger name="jdbc.sqltiming" level="ERROR" />
<logger name="jdbc.resultset" level="ERROR" />

<!-- UNCOMMENT THE BELOW TO HIDE THE RESULT SET TABLE OUTPUT -->
<!--<logger name="jdbc.resultsettable" level="ERROR" /> -->

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

3 расскажите log4jdbc2 о вашей конфигурации ведения журнала:

создайте файл с именем log4jdbc.log4j2.свойства в корне classpath, который src / test / resources или src / main / resources в проекте Maven. Этот файл имеет одну строку, которая находится ниже:

log4jdbc.спилогделегатор.имя=net.sf.log4jdbc.лог.slf4j.Slf4jSpyLogDelegator

4 измените класс драйвера DB и URL-адрес, как показано ниже:

spring.database.driverClassName=net.sf.log4jdbc.sql.jdbcapi.DriverSpy
#append log4jdbc after jdbc part of the URL: hsql example
spring.datasource.url=jdbc:log4jdbc:hsqldb:mem:db_name 

в дополнение к регистрации SQL он также будет регистрировать в табличном формате результаты всех выполненных запросов. Это можно отключить в соответствии с комментарием в образце ведения журнала конфиг.

Пример Вывода:

10:44:29.400 [main] DEBUG jdbc.sqlonly -
5. select memberrole0_.member_id as member_i2_12_0_, memberrole0_.id as id1_12_0_, memberrole0_.id 
as id1_12_1_, memberrole0_.member_id as member_i2_12_1_, memberrole0_.role_id as role_id3_12_1_, 
role1_.id as id1_17_2_, role1_.name as name2_17_2_ from member_roles memberrole0_ left outer 
join roles role1_ on memberrole0_.role_id=role1_.id where memberrole0_.member_id=104 

10:44:29.402 [main] INFO  jdbc.resultsettable - 
|----------|---|---|----------|--------|---|-----|
|member_id |id |id |member_id |role_id |id |name |
|----------|---|---|----------|--------|---|-----|
|----------|---|---|----------|--------|---|-----|