通常的logback配置文件是這樣:
<?xml version="1.0" encoding="UTF-8"?> <configuration debug="false"> <!--輸出到控制台--> <appender name="console" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern> </encoder> </appender> <!--輸出到文件--> <appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender"> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>logback.%d{yyyy-MM-dd}.log</fileNamePattern> </rollingPolicy> <encoder> <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern> </encoder> </appender> <root level="info"> <appender-ref ref="console" /> <appender-ref ref="file" /> </root> </configuration>
我們使用的是spring boot自帶的logback所以pom文件不用做調整,只需要加上JPA相關代碼即可。
controller的代碼只是做一個簡單的查詢帶參數:
@Transactional public class FileController { @Autowired private FileRepository fileRepository; @RequestMapping("getfile") public String getOpinionBills() { OpnFileDO one = fileRepository.getOne("14247"); return one.toString(); } }
對它進行單元測試:
public class FileControllerTest extends ControllerTestBase { @Test public void fileTest() throws Exception { mockMvc .perform(MockMvcRequestBuilders.get("/getfile") // 測試的相對地址 .accept(MediaType.APPLICATION_JSON_UTF8) // accept response content type ) .andExpect(status().isOk()) // 期待返回狀態嗎碼200 .andDo(MockMvcResultHandlers.print()); // 打印返回的 http response 信息 } }
測試代碼也不重要,只是就是為了方便測試,運行測試:
這時的輸出日志中是沒有日志的。文件中也是沒有的:
下面加sql日志,最簡單的方法就是修改yml配置文件:
spring: jpa: properties: hibernate: format_sql: true #配置在日志中打印出執行的 SQL 語句信息。 show-sql: true
這樣就可以console中看到格式化后的sql,但這里沒有參數。
接下來,我們要在console中看到參數,並在日志文件中看到Sql和參數,修改logback配置文件:
<?xml version="1.0" encoding="UTF-8"?> <configuration debug="false"> <!--輸出到控制台--> <appender name="console" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern> </encoder> </appender> <!--輸出到文件--> <appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender"> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>logback.%d{yyyy-MM-dd}.log</fileNamePattern> </rollingPolicy> <encoder> <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern> </encoder> </appender> <!-- 1. 輸出SQL 到控制台和文件--> <logger name="org.hibernate.SQL" additivity="false" > <level value="DEBUG" /> <appender-ref ref="file" /> <appender-ref ref="console" /> </logger> <!-- <!– 2. 輸出SQL 的參數到控制台和文件–>--> <logger name="org.hibernate.type.descriptor.sql.BasicBinder" additivity="false" level="TRACE" > <level value="TRACE" /> <appender-ref ref="file" /> <appender-ref ref="console" /> </logger> <root level="info"> <appender-ref ref="console" /> <appender-ref ref="file" /> </root> </configuration>
運行測試后發現:
14:06:54.130 [main] DEBUG org.hibernate.SQL -
select
opnfiledo0_.id as id1_0_0_
from
file opnfiledo0_
where
opnfiledo0_.id=?
Hibernate:
select
opnfiledo0_.id as id1_0_0_
from
file opnfiledo0_
where
opnfiledo0_.id=?
14:06:54.149 [main] TRACE o.h.type.descriptor.sql.BasicBinder - binding parameter [1] as [VARCHAR] - [14247]
參數已經有了,但是Sql多打了一遍。
日志文件中則正常
14:06:54.130 [main] DEBUG org.hibernate.SQL -
select
opnfiledo0_.id as id1_0_0_
from
file opnfiledo0_
where
opnfiledo0_.id=?
14:06:54.149 [main] TRACE o.h.type.descriptor.sql.BasicBinder - binding parameter [1] as [VARCHAR] - [14247]
我們把yml中的:show-sql: true
現在console中的日志和日志文件中的sql都正常了。
開發環境這樣的配置沒有問題,上生產后,我們的日志級別error怎么辦:
不能修改logback的配置文件,只能修改yml配置文件:
logging:
level:
root: error
發現這個Sql還是存在,不滿足需求。
我們回退到原始的logback配置文件那里,不修改logback的配置文件,而是修改yml文件中日志的配置來實現打印sql:
logging:
level:
root: info
org:
hibernate:
SQL: debug
type:
descriptor:
sql:
BasicBinder: trace
沒有問題,我們在調整yml實現生產環境的日志級別:
logging:
level:
root: error
org:
hibernate:
SQL: error
type:
descriptor:
sql:
BasicBinder: error
當然還有一種解決方法,就是再寫一個logback的配置文件,通過修改yml配置文件的logging.config來指定配置文件來實現修改日志級別的功能,只不過這種方式顯的有點麻煩了。