JPA 使用log4j2输出SQL日志到文件

上一篇介绍了 JPA 使用llogback输出SQL日志到文件, 这篇我们使用log4j:

还使用上节的单元测试代码 :先修改一下POM:

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
            <exclusions>
                <!-- 排除自带的logback依赖 -->
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-logging</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-log4j2</artifactId>
        </dependency>

通常的log4j2的配置文件如下:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
    <Appenders>

        <!--这个输出控制台的配置-->
        <console name="Console" target="SYSTEM_OUT">
            <!--输出日志的格式-->
            <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t{2}] %-5level %logger{4} - %msg%n"/>
        </console>
        <!-- 这个会打印出所有的info及以下级别的信息,每次大小超过size,则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档-->
        <RollingFile name="RollingFileInfo" fileName="logs/cis-mr-audit.log"
                     filePattern="logs/$${date:yyyy-MM}/cis-mr-audit-%d{yyyy-MM-dd}-%i.log">
            <PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
            <Policies>
                <TimeBasedTriggeringPolicy/>
                <SizeBasedTriggeringPolicy size="5 MB"/>
            </Policies>
        </RollingFile>

    </Appenders>
    <Loggers>
        <Root level="info">
            <AppenderRef ref="Console" />
            <AppenderRef ref="RollingFileInfo" />
        </Root>
    </Loggers>
</Configuration>

注意,这里没有对每一个的appender设置level,统一使用root的level.

和上节一样,如果yml文件没有特殊配置的话,也是输出不了sql的。

即使加了show-sql也只是在console中显示,在日志文件中不显示。

同上节的配置样,问题出在org.hibernate.sql和org.hibernate.type.descriptor.sql.BasicBinder上

修改yml配置文件:

logging:
  level:
    root: info
    org:
      hibernate:
        SQL: debug   #debug时显示sql
        type:
          descriptor:
            sql:
              BasicBinder: trace  #trace时,显示参数

这样console与文件中的sql就都可以显示了,在生产切换日志级别,只需要修改yml文件即可。