Log4j XML構成ファイルを使用してHibernateロギングを構成しますか?


89

Log4jのXMLスタイルの構成ファイルを使用してHibernateのロギングを構成する方法に関するドキュメントを見つけることができませんでした。

これは可能ですか、またはプロパティスタイルの構成ファイルを使用してHibernateのログを制御する必要がありますか?

誰かが情報やドキュメントへのリンクを持っている場合は、それをいただければ幸いです。

編集:
明確にするために、私はHibernateを制御する実際のXML構文の例を探しています。

EDIT2:
これが私のXML構成ファイルにあるものです。

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">

<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
    <appender name="console" class="org.apache.log4j.ConsoleAppender">
        <param name="Threshold" value="info"/>
        <param name="Target" value="System.out"/>
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%d{ABSOLUTE} [%t] %-5p %c{1} - %m%n"/>
        </layout>
    </appender>
    <appender name="rolling-file" class="org.apache.log4j.RollingFileAppender">
        <param name="file" value="Program-Name.log"/>
        <param name="MaxFileSize" value="1000KB"/>
    <!-- Keep one backup file -->
        <param name="MaxBackupIndex" value="4"/>
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%d [%t] %-5p %l - %m%n"/>
        </layout>
    </appender>

    <root>
        <priority value ="debug" />
        <appender-ref ref="console" />
        <appender-ref ref="rolling-file" />
    </root>
</log4j:configuration>

ログは問題なく機能しますが、現在はログが殺到しているため、アプリケーションレベルのログとは別に、休止状態のログを下げて制御する方法を探しています。これを行うために設定ファイルを使用する例を見つけましたが、XMLファイルでこれを行うにはどうしたらいいのかただ考えていました。


nemo、ypuはこれをxmlの方法で行う方法を見つけたことがありますか?もしそうなら、あなたはあなたの質問への回答を投稿することができます。
homaxto 2009

ホマクト、やった。機会がありましたらお知らせします。
James McMahon、

<アペンダ-REF REF =「コンソール」/>あなたは休止状態ログの完全なcatalina.outを表示したくない場合は休止状態のログはcatalina.outにも後藤ことを、あなたはこのタグをコメントしなければならないん
エンリケ・サン・マルティン

回答:


161

http://docs.jboss.org/hibernate/core/3.3/reference/en/html/session-configuration.html#configuration-loggingから

ロガーのカテゴリのリストは次のとおりです。

Category                    Function

org.hibernate.SQL           Log all SQL DML statements as they are executed
org.hibernate.type          Log all JDBC parameters
org.hibernate.tool.hbm2ddl  Log all SQL DDL statements as they are executed
org.hibernate.pretty        Log the state of all entities (max 20 entities) associated with the session at flush time
org.hibernate.cache         Log all second-level cache activity
org.hibernate.transaction   Log transaction related activity
org.hibernate.jdbc          Log all JDBC resource acquisition
org.hibernate.hql.ast.AST   Log HQL and SQL ASTs during query parsing
org.hibernate.secure        Log all JAAS authorization requests
org.hibernate               Log everything (a lot of information, but very useful for troubleshooting) 

log4j XML構成ファイルに貼り付けるためのフォーマット:

<!-- Log all SQL DML statements as they are executed -->
<Logger name="org.hibernate.SQL" level="debug" />
<!-- Log all JDBC parameters -->
<Logger name="org.hibernate.type" level="debug" />
<!-- Log all SQL DDL statements as they are executed -->
<Logger name="org.hibernate.tool.hbm2ddl" level="debug" />
<!-- Log the state of all entities (max 20 entities) associated with the session at flush time -->
<Logger name="org.hibernate.pretty" level="debug" />
<!-- Log all second-level cache activity -->
<Logger name="org.hibernate.cache" level="debug" />
<!-- Log transaction related activity -->
<Logger name="org.hibernate.transaction" level="debug" />
<!-- Log all JDBC resource acquisition -->
<Logger name="org.hibernate.jdbc" level="debug" />
<!-- Log HQL and SQL ASTs during query parsing -->
<Logger name="org.hibernate.hql.ast.AST" level="debug" />
<!-- Log all JAAS authorization requests -->
<Logger name="org.hibernate.secure" level="debug" />
<!-- Log everything (a lot of information, but very useful for troubleshooting) -->
<Logger name="org.hibernate" level="debug" />

注意:ほとんどのロガーはDEBUGレベルを使用しますが、org.hibernate.typeはTRACEを使用します。以前のバージョンのHibernateではorg.hibernate.typeもDEBUGを使用していましたが、Hibernate 3以降では、JDBCパラメーターバインディングロギングを表示するためにレベルをTRACE(またはALL)に設定する必要があります。

そして、カテゴリーはそのように指定されます:

<logger name="org.hibernate">
    <level value="ALL" />
    <appender-ref ref="FILE"/>
</logger>

ルート要素の前に配置する必要があります。


<appender-ref>が何をしているのかわかりません。設定でそれをアペンダーに変更すると、Hibernateはまだコンソールとファイルアペンダーの両方にログを記録しているようです。奇妙な。
ジェームズマクマホン

これは奇妙です。org.hibernate.typeのHibernate 3.2.6ではDEBUGレベルを使用でき、すべてのパラメーターをログに記録します。hibernate 3.5.6 DEBUGでは十分ではありません。TRACEを配置する必要があります。これは実際に多くのログを記録するため、(知っていれば)私見で大丈夫です!
Riccardo Cossu

クラス名はHibernate 4.2でリファクタリングされたので、トランザクションロギングには使用する必要がありますorg.hibernate.engine.transaction。参照:docs.jboss.org/hibernate/orm/4.2/devguide/en-US/html/...
gerrytan

次のようにロガーをstandalone.xmlに追加することもできます:<logger categoriy = "org.hibernate"> <level name = "DEBUG" /> </ logger>
cw24

1
なければならないLでは、例えば、<Logger name="org.hibernate.SQL" level="debug" />実際に大文字にしますか?L:を大文字にすると、起動時にTomcatでエラーが発生します"The content of element type 'log4j:configuration' must match '(renderer*,throwableRenderer*,appender*,plugin*,(category|logger)*,root?,(categoryFactory|loggerFactory)?)'."。これを実際にlog4j.xmlファイルに入力する方法についても混乱しています。<logger>カテゴリごとに個別のブロックを用意する<level>か、タグを追加する必要がありますか、それとも、あなたが提示したワンライナーで済ますか?
MegaMatt 2017年

25

Loki回答はHibernate 3ドキュメントを指し示し、優れた情報を提供しますが、それでも期待した結果が得られませんでした。

たたき、腕を振り、一般的な死んだネズミを走らせて、ようやく私のチーズを見つけました。

Hibernate 3はJava(SLF4J)のSimple Logging Facadeを使用しているため(ドキュメントごと)、Log4j 1.2に依存している場合、Hibernateロギングを完全に構成したい場合はslf4j-log4j12-1.5.10.jar 必要です。log4j構成ファイル。これが次の人に役立つことを願っています。


うん、ファサードを基礎となるロギングレイヤーに配線するには、slf4j-log4j12-1.5.10.jarが必要です。ロギング層としてlog4jを使用している場合、構成ファイルは依然としてlog4j構成です。
James McMahon、

7

homaxtoのコメントに応えて、これは私が今持っているものです。

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">

<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
    <appender name="console" class="org.apache.log4j.ConsoleAppender">
        <param name="Threshold" value="debug"/>
        <param name="Target" value="System.out"/>
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%d{ABSOLUTE} [%t] %-5p %c{1} - %m%n"/>
        </layout>
    </appender>
    <appender name="rolling-file" class="org.apache.log4j.RollingFileAppender">
        <param name="file" value="Program-Name.log"/>
        <param name="MaxFileSize" value="500KB"/>
        <param name="MaxBackupIndex" value="4"/>
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%d [%t] %-5p %l - %m%n"/>
        </layout>
    </appender>

    <logger name="org.hibernate">
        <level value="info" />
    </logger>

    <root>
        <priority value ="debug" />
        <appender-ref ref="console" />
        <appender-ref ref="rolling-file" />
    </root>
</log4j:configuration>

重要な部分は

<logger name="org.hibernate">
    <level value="info" />
</logger>

お役に立てれば。


5

これが私が使うものです:

<logger name="org.hibernate">
    <level value="warn"/>
</logger>

<logger name="org.hibernate.SQL">
    <level value="warn"/>
</logger>

<logger name="org.hibernate.type">
    <level value="warn"/>
</logger>

<root>
    <priority value="info"/>
    <appender-ref ref="C1"/>
</root> 

明らかに、私はHibernateメッセージを見たくありません;)-出力を取得するには、レベルを「デバッグ」に設定します。


3

答えは役に立ちました。変更後、SQLステートメントのログが重複して取得されました。1つはlog4jログファイルに、もう1つは標準コンソールにあります。標準コンソールからログを削除するために、persistence.xmlファイルをshow_sqlをfalseに変更しました。format_sqlをtrueに維持すると、log4jログファイルにも影響するため、trueを維持しました。

<persistence xmlns="http://java.sun.com/xml/ns/persistence"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
        version="2.0">
    <persistence-unit name="myUnit" transaction-type="RESOURCE_LOCAL">
        <provider>org.hibernate.ejb.HibernatePersistence</provider>
        <properties>
            <property name="javax.persistence.jdbc.driver" value="org.hsqldb.jdbcDriver"/>
            <property name="javax.persistence.jdbc.url" value="jdbc:hsqldb:file:d:\temp\database\cap1000;shutdown=true"></property>
            <property name="dialect" value="org.hibernate.dialect.HSQLDialect"/>
            <property name="hibernate.show_sql" value="false"/>
            <property name="hibernate.format_sql" value="true"/>
            <property name="hibernate.connection.username" value="sa"/>
            <property name="hibernate.hbm2ddl.auto" value="create-drop"/>
        </properties>
    </persistence-unit>
</persistence>

0

次のlog4jようなカテゴリタグを使用してファイルを構成できます(例のコンソールアペンダーを使用)。

<appender name="console" class="org.apache.log4j.ConsoleAppender">
    <layout class="org.apache.log4j.PatternLayout">
        <param name="ConversionPattern" value="%d{yy-MM-dd HH:mm:ss} %p %c - %m%n" />
    </layout>
</appender>
<category name="org.hibernate">
    <priority value="WARN" />
</category>
<root>
    <priority value="INFO" />
    <appender-ref ref="console" />
</root>

そのため、休止状態からの警告、エラー、または致命的なメッセージがすべて表示され、それ以上は表示されません。また、コードとライブラリコードは情報レベルになります(つまり、情報、警告、エラー、致命的)。

ライブラリのログレベルを変更するには、たとえば、非アクティブなスプリング情報ログにカテゴリを追加するだけです。

<category name="org.springframework">
    <priority value="WARN" />
</category>

または、別のアペンダーを使用して、加法性を解除します(加法性のデフォルト値はtrueです)。

<category name="org.springframework" additivity="false">
    <priority value="WARN" />
    <appender-ref ref="anotherAppender" />
</category>

また、そのhibernateですべてのクエリをログに記録したくない場合は、hibernateプロパティshow_sqlをに設定しfalseます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.