【问题标题】:Hibernate logging in Spring application on JBoss 7.1在 JBoss 7.1 上的 Spring 应用程序中休眠日志记录
【发布时间】:2012-09-14 16:00:56
【问题描述】:

我有与 Hibernate 集成的 Spring MVC 应用程序。

我正在尝试使用 Log4j 记录 jdbc SQL 语句参数,但它不起作用。我的 log4j.properties 配置文件似乎没有做任何更改。这是项目配置:

我正在使用 Maven、Eclipse 和 log4j.properties 文件位于项目源文件夹的顶部(据我所知,在类路径中)。

pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>TestProject</groupId>
  <artifactId>TestProject</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <properties>
    <org.hibernate.version>3.6.0.Final</org.hibernate.version>
    <org.springframework.version>3.1.2.RELEASE</org.springframework.version>
    <org.apache.tiles.version>2.2.2</org.apache.tiles.version>
    <slf4j-log4j12.version>1.7.0</slf4j-log4j12.version>
  </properties>
  <dependencies>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>${org.springframework.version}</version>
        <scope>runtime</scope>
        <exclusions>
            <exclusion>
                <artifactId>commons-logging</artifactId>
                <groupId>commons-logging</groupId>
            </exclusion>
        </exclusions>
    </dependency>
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-core</artifactId>
        <version>${org.hibernate.version}</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-orm</artifactId>
        <version>${org.springframework.version}</version>
    </dependency>
    <dependency>
        <groupId>org.hsqldb</groupId>
        <artifactId>hsqldb</artifactId>
        <version>2.2.8</version>
    </dependency>
    <dependency>
        <groupId>org.javassist</groupId>
        <artifactId>javassist</artifactId>
        <version>3.16.1-GA</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>${org.springframework.version}</version>
    </dependency>
    <dependency>
        <groupId>org.apache.tiles</groupId>
        <artifactId>tiles-extras</artifactId>
        <version>${org.apache.tiles.version}</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.security</groupId>
        <artifactId>spring-security-web</artifactId>
        <version>${org.springframework.version}</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.security</groupId>
        <artifactId>spring-security-config</artifactId>
        <version>${org.springframework.version}</version>
    </dependency>
    <dependency>
        <groupId>cglib</groupId>
        <artifactId>cglib</artifactId>
        <version>2.2</version>
    </dependency>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <version>${slf4j-log4j12.version}</version>
        <scope>runtime</scope>
    </dependency>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-log4j12</artifactId>
        <version>${slf4j-log4j12.version}</version>
        <scope>runtime</scope>
    </dependency>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>jcl-over-slf4j</artifactId>
        <version>${slf4j-log4j12.version}</version>
        <scope>runtime</scope>
    </dependency>
    <dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
        <version>1.2.17</version>
    </dependency>
  </dependencies>
</project>

log4j.properties

log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n

log4j.rootLogger=ERROR, stdout

log4j.logger.main.mvc.model.hibernate=DEBUG

log4j.logger.org.hibernate=INFO
log4j.logger.org.hibernate.SQL=DEBUG
log4j.logger.org.hibernate.type=TRACE

【问题讨论】:

    标签: spring hibernate logging log4j


    【解决方案1】:

    好的。所以我终于让它工作了!

    所有这些问题都是由 JBoss AS 7.1 造成的。

    下面是如何在 JBoss AS 7.1 上运行的 Spring MVC 应用程序上设置 slf4j+log4j 日志记录:

    1. 有些内置的 JBoss 模块必须关闭,所以 - 将 jboss-deployment-structure.xml 添加到您的 META-INF/ 目录
    2. 您必须在类路径中有这些库:log4j.jarslf4j-api.jarslf4j-log4j12.jar、jcl-over-sfl4j.jar。 Spring 的默认 common-logging.jar 必须从类路径中排除。
    3. 您必须在类路径中有 log4j.propertieslog4j.xml 文件。

    这些文件让我可以控制日志,并且我实现了我的目标 - 记录 Hibernate SQL 语句参数。

    jboss-deployment-structure.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <jboss-deployment-structure>
        <deployment>
            <exclusions>
                <module name="org.apache.log4j" />
                <module name="org.slf4j" />
                <module name="org.slf4j.impl" />
            </exclusions>
        </deployment>
    </jboss-deployment-structure> 
    

    pom.xml

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
      <modelVersion>4.0.0</modelVersion>
      <groupId>bladositto</groupId>
      <artifactId>TestLogging</artifactId>
      <version>0.0.1-SNAPSHOT</version>
      <properties>
        <org.hibernate.version>3.6.0.Final</org.hibernate.version>
        <org.springframework.version>3.1.2.RELEASE</org.springframework.version>
        <org.apache.tiles.version>2.2.2</org.apache.tiles.version>
        <slf4j-log4j12.version>1.7.0</slf4j-log4j12.version>
      </properties>
      <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>${org.springframework.version}</version>
            <scope>runtime</scope>
            <exclusions>
                <exclusion>
                    <artifactId>commons-logging</artifactId>
                    <groupId>commons-logging</groupId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-core</artifactId>
            <version>${org.hibernate.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-orm</artifactId>
            <version>${org.springframework.version}</version>
        </dependency>
        <dependency>
            <groupId>org.hsqldb</groupId>
            <artifactId>hsqldb</artifactId>
            <version>2.2.8</version>
        </dependency>
        <dependency>
            <groupId>org.javassist</groupId>
            <artifactId>javassist</artifactId>
            <version>3.16.1-GA</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>${org.springframework.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.tiles</groupId>
            <artifactId>tiles-extras</artifactId>
            <version>${org.apache.tiles.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-web</artifactId>
            <version>${org.springframework.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-config</artifactId>
            <version>${org.springframework.version}</version>
        </dependency>
        <dependency>
            <groupId>cglib</groupId>
            <artifactId>cglib</artifactId>
            <version>2.2</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>${slf4j-log4j12.version}</version>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>${slf4j-log4j12.version}</version>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>jcl-over-slf4j</artifactId>
            <version>${slf4j-log4j12.version}</version>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
        </dependency>
      </dependencies>
    </project>
    

    log4j.properties

    log4j.rootLogger=INFO, A1, R
    
    log4j.appender.A1=org.apache.log4j.ConsoleAppender
    log4j.appender.A1.Target=System.out
    log4j.appender.A1.layout=org.apache.log4j.PatternLayout
    log4j.appender.A1.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
    
    log4j.appender.R=org.apache.log4j.RollingFileAppender
    log4j.appender.R.File=example.log
    log4j.appender.R.MaxFileSize=100KB
    log4j.appender.R.MaxBackupIndex=1
    log4j.appender.R.layout=org.apache.log4j.PatternLayout
    log4j.appender.R.layout.ConversionPattern=%p %t %c - %m%n
    
    log4j.logger.org.hibernate.SQL=DEBUG
    log4j.logger.org.hibernate.type=TRACE
    

    【讨论】:

      【解决方案2】:

      您在 log4j 配置中使用它

      org.apache.commons.digester.Digester=INFO
      org.hibernate=INFO
      org.springframework.orm=DEBUG,stdout
      

      应该是这样的

      log4j.logger.org.apache.commons.digester.Digester=INFO
      log4j.logger.org.hibernate=INFO
      log4j.logger.org.springframework.orm=DEBUG,stdout
      

      【讨论】:

        【解决方案3】:

        在您的 hibernate.cfg.xml 或您的 persistence.xml 中尝试以下操作:

        <property name="hibernate.show_sql">true</property>
        <property name="hibernate.use_sql_comments">true</property>
        

        在您的log4j.properties 中加上以下内容:

        log4j.rootLogger=INFO,stdout
        
        log4j.appender.stdout=org.apache.log4j.ConsoleAppender
        log4j.appender.stdout.Threshold=INFO
        log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
        log4j.appender.stdout.layout.ConversionPattern=%d{dd/MM/yyyy HH:mm:ss} %-5p %x - %m%n
        
        org.apache.commons.digester.Digester=INFO
        org.hibernate=INFO
        org.springframework.orm=DEBUG,stdout
        

        毫无疑问,如果您将这两个文件放在 webapp 的类路径中,您将拥有日志。

        使用 Maven,您应该将这些文件放在文件夹 src/main/resources 中。它们将被打包在生成的 target 文件夹中,如果您执行“mvn clean package”,您将获得该文件夹。

        要声明一个 slf4j 记录器,你应该这样做:

        public class User {
            public static final Logger logger = LoggerFactory.getLogger(User.class);
        
            //fields getters and setters...
        
            public User() {
        
            }
        
            public User(DTO userDTO) {
                this.username = userDTO.username;
                // etc.
                logger.debug("your user was initialized with the DTO, see this.toString()=?", this.toString());
            } 
        
        
            //etc. some other methods, if any
        
            //toString()
            public String toString() {
                //return a String representation of an User object.
            }
        }
        

        要限制特定附加程序的日志级别,您应该使用:

        log4j.logger.appenderName.packageName.className=LEVEL
        

        请注意您当前正在使用:

        log4j.logger.packageName.className=LEVEL
        

        祝你好运!

        【讨论】:

        • 不幸的是,这不起作用。我不知道我做错了什么。我的 pom.xml 文件没问题,对吧?我已将 log4j.properties 文件放入 src/main/resources。在包 services 的类 UserService 中有一行 Logger.getLogger(getClass()).info(user); 导致 20:46:52,449 INFO [services.UserService] (http-localhost-127.0.0.1-8080-1) User[id: null loginEmail: null alias: Asdf password: asdfasdfasdf] 然后我尝试使用 log4j.logger.services.UserService 来限制它=WARN 在 log4j.properties 但它仍然显示在日志中。看起来这个文件还没有被 log4j 使用
        • 您已经在pom.xml 中添加了slf4j 依赖项,因此slf4j 可能与默认配置一起使用。请参阅编辑的响应以在 java 类中使用 slf4j 的示例。
        • 好的。这是使用 SLF4J 记录器而不是 LOG4J 记录器的好技巧。尽管它仍然没有获得对日志记录的控制权。它让我发疯。我开始怀疑这不是我的应用程序服务器的问题吗?我正在使用 JBoss AS 7。
        猜你喜欢
        • 2016-09-04
        • 1970-01-01
        • 1970-01-01
        • 2011-06-24
        • 2015-04-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多