2

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
4

3 に答える 3

3

わかった。だから私はついにそれを動かしました!

これらのトラブルはすべて、JBossAS7.1が原因で発生しました。

したがって、JBossAS7.1で実行されるSpringMVCアプリケーションでslf4j+log4jロギングを設定する方法は次のとおりです。

  1. オフにする必要のある組み込みのJBossモジュールがあるため、 META-INF/ディレクトリにjboss-deployment-structure.xmlを追加します
  2. クラスパスに次のライブラリが必要です:log4j.jarslf4j-api.jarslf4j-log4j12.jarjcl-over-sfl4j.jar。Springのデフォルトのcommon-logging.jarをクラスパスから除外する必要があります。
  3. クラスパスにlog4j.propertiesまたはlog4j.xmlファイルが必要です。

これらのファイルにより、ログを制御できるようになり、目標であるHibernateSQLステートメントパラメーターのログ記録を達成しました。

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
于 2012-09-16T19:41:04.517 に答える
1

これを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
于 2012-09-16T08:10:30.180 に答える
0

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

これらの2つのファイルをWebアプリケーションのクラスパスに配置すると、ログが作成されることは間違いありません。

Mavenでは、これらのファイルをフォルダー内に配置する必要がありますsrc/main/resourcestargetこれらは、「mvncleanpackage」を実行した場合に取得する結果のフォルダー内にパッケージ化されます。

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

幸運を!

于 2012-09-14T16:24:22.130 に答える