在 Spring Boot 应用程序中,Hibernate SQL 语句没有使用 log4j 登录到单独的日志文件中
Posted
技术标签:
【中文标题】在 Spring Boot 应用程序中,Hibernate SQL 语句没有使用 log4j 登录到单独的日志文件中【英文标题】:Hibernate SQL statements are not getting logged in separate log file using log4j in spring boot application 【发布时间】:2020-06-07 17:57:12 【问题描述】:我在 JBOSS 中部署了 Spring Boot + Hibernate + Log4j 中的 Web 应用程序。如果我们在 application.properties 中使用“spring.jpa.show-sql = true”,那么所有休眠 sql 查询都会记录在 server.log 中。根据 Hibernate Log4j 指令,我们需要将此属性设置为 false,以便根据 Log4j 配置将 sql 语句记录在单独的日志文件中。如果我们将其设置为 false,那么 sql 语句也不会记录在单独的日志文件中。除休眠日志外,所有其他与应用程序相关的日志都记录在单独的日志文件中。请帮助解决此问题。
Below is the entry in application.properties file.
spring.jpa.show-sql = false
spring.jpa.open-in-view=false
spring.datasource.ucm.default-auto-commit=false
spring.jpa.properties.hibernate.enable_lazy_load_no_trans=true
spring.jpa.properties.hibernate.id.new_generator_mappings=false
spring.jackson.serialization.fail-on-empty-beans=false
# SQL statements and parameters
log4j.logger.org.hibernate.SQL=debug
log4j.logger.org.hibernate.type.descriptor.sql=trace
Log4j2.xml
<?xml version="1.0" encoding="UTF-8"?>
<Configuration monitorInterval="30">
<Properties>
<Property name="LOG_PATTERN">%dyyyy-MM-dd'T'HH:mm:ss.SSSZ %p %m%n
</Property>
<Property name="APP_LOG_ROOT">c:/log/VendorPortal</Property>
</Properties>
<Appenders>
<Console name="console" target="SYSTEM_OUT" follow="false">
<PatternLayout pattern="$LOG_PATTERN" />
</Console>
<!-- File Appender -->
<RollingFile name="RollingFile"
fileName="c:/log/vendorportal.log"
filePattern="c:/log/vendorportal-%dMM-dd-yyyy.log"
ignoreExceptions="false">
<PatternLayout>
<Pattern>%d %p %c1. [%t] %m%n</Pattern>
</PatternLayout>
<Policies>
<TimeBasedTriggeringPolicy />
<SizeBasedTriggeringPolicy size="100 MB" />
</Policies>
</RollingFile>
<Console name="STDOUT" target="SYSTEM_OUT"
ignoreExceptions="false">
<PatternLayout pattern="%m%n" />
</Console>
</Appenders>
<Loggers>
<Logger name="org.springframework" additivity="false"
level="error">
<AppenderRef ref="RollingFile" />
</Logger>
<Logger name="org.hibernate" level="info" additivity="false">
<AppenderRef ref="RollingFile" />
</Logger>
<Logger name="org.hibernate.SQL" level="DEBUG"
additivity="false">
<AppenderRef ref="RollingFile" />
</Logger>
<Logger name="org.hibernate.type.descriptor.sql" level="TRACE"
additivity="false">
<AppenderRef ref="RollingFile" />
</Logger>
<Root level="error">
<AppenderRef ref="console" />
<AppenderRef ref="RollingFile" />
</Root>
</Loggers>
</Configuration>
pom.xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
</exclusions>
</dependency>
【问题讨论】:
【参考方案1】:您需要在我们的应用程序中放置 Log4j 配置文件。然后在其中插入 Logger 标签:
<Configuration status="WARN" strict="true">
<Properties>
<Property name="filename">logfile.log</Property>
</Properties>
<Appenders>
<Appender type="Console" name="Console" target="SYSTEM_OUT">
<Layout type="PatternLayout">
<Pattern>%dHH:mm:ss.SSS [%t] %-5level %logger36 - %msg%n</Pattern>
</Layout>
</Appender>
<Appender type="File" name="FileAppender" fileName="$filename">
<Layout type="PatternLayout">
<Pattern>%d %p %C1. [%t] %m%n</Pattern>
</Layout>
</Appender>
</Appenders>
<Loggers>
<Logger name="org.hibernate.SQL" level="debug" additivity="false">
<AppenderRef ref="Console"/>
</Logger>
<Logger name="org.hibernate.type.descriptor.sql" level="trace" additivity="false">
<AppenderRef ref="Console"/>
</Logger>..........
......
....
雅阿里
【讨论】:
感谢您的回复。我已经有了上述配置的 log4j2.xml。仍然没有单独的休眠日志显示在正在创建的日志文件中 我也有类似的问题。 @Felsia 你是怎么解决的? 阿里亚雷特·索尔坦 chakeram......YA ALI......【参考方案2】:根据您发布的查询,您的配置似乎已更正。
来自:
<Logger name="org.hibernate.SQL" level="DEBUG"
....
</Logger>
<Logger name="org.hibernate.type.descriptor.sql" level="TRACE"
....
</Logger>
<Root level="error">
....
</Root>
到:
<Logger name="org.hibernate.SQL" level="DEBUG"
....
</Logger>
<Logger name="org.hibernate.type.descriptor.sql" level="TRACE"
....
</Logger>
<Root level="DEBUG">
....
</Root>
由于日志记录级别具有优先级 => TRACE > DEBUG > INFO > ERROR > WARN > FATAL
希望这有助于解决问题。
【讨论】:
以上是关于在 Spring Boot 应用程序中,Hibernate SQL 语句没有使用 log4j 登录到单独的日志文件中的主要内容,如果未能解决你的问题,请参考以下文章
Spring Boot - org.springframework.beans.factory.BeanCreationException:使用名称创建 bean 时出错
在 docker 容器中重新部署 spring-boot 应用程序?
在 Spring Boot 应用程序中自动装配 ObjectMapper
如何在不从 spring-boot-starter-web 继承的情况下在 Spring Boot 中获取 ObjectMapper 实例?