Định cấu hình ghi nhật ký Hibernate bằng tệp cấu hình Log4j XML?


89

Tôi không thể tìm thấy bất kỳ tài liệu nào về cách định cấu hình ghi nhật ký của Hibernate bằng tệp cấu hình kiểu XML cho Log4j.

Điều này có khả thi không hay tôi đã sử dụng tệp cấu hình kiểu thuộc tính để kiểm soát việc ghi nhật ký của Hibernate?

Nếu bất kỳ ai có bất kỳ thông tin hoặc liên kết đến tài liệu sẽ đánh giá cao.

CHỈNH SỬA:
Chỉ để làm rõ, tôi đang tìm một ví dụ về cú pháp XML thực tế để điều khiển Hibernate.

EDIT2:
Đây là những gì tôi có trong tệp cấu hình XML của mình.

<?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>

Ghi nhật ký hoạt động tốt nhưng tôi đang tìm cách để giảm bớt và kiểm soát việc ghi nhật ký ngủ đông theo cách tách biệt với ghi nhật ký cấp ứng dụng của tôi, vì nó hiện đang làm ngập các nhật ký của tôi. Tôi đã tìm thấy các ví dụ về việc sử dụng tệp tùy chọn để thực hiện việc này, tôi chỉ tự hỏi làm cách nào tôi có thể thực hiện việc này trong tệp XML.


nemo, bạn đã bao giờ tìm ra cách thực hiện việc này theo cách xml chưa? Có lẽ bạn có thể đăng câu trả lời cho câu hỏi của mình nếu bạn làm như vậy.
homaxto

homaxto, tôi đã làm. Tôi sẽ đăng nó cho bạn khi tôi có cơ hội.
James McMahon

<appender-ref ref = "console" /> có goto nhật ký ngủ đông cũng vào catalina.out, bạn nên nhận xét thẻ này nếu bạn không muốn thấy catalina.out chứa đầy nhật ký ngủ đông
Enrique San Martín

Câu trả lời:


161

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

Đây là danh sách các loại trình ghi nhật ký:

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) 

Được định dạng để dán vào tệp cấu hình XML log4j:

<!-- 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" />

NB: Hầu hết các trình ghi nhật ký sử dụng cấp GỠ GỠ, tuy nhiên org.hibernate.type sử dụng TRACE. Trong các phiên bản trước của Hibernate org.hibernate.type cũng sử dụng DEBUG, nhưng kể từ Hibernate 3, bạn phải đặt mức thành TRACE (hoặc TẤT CẢ) để xem ghi nhật ký liên kết tham số JDBC.

Và một danh mục được chỉ định như vậy:

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

Nó phải được đặt trước phần tử gốc.


Tôi không chắc <appender-ref> đang làm gì ở đó, khi tôi thay đổi nó thành appender trong cấu hình của mình, hibernate dường như vẫn đăng nhập vào cả console và appender tệp của tôi. Thật kỳ lạ.
James McMahon

Điều này thật kỳ lạ, trong Hibernate 3.2.6 cho org.hibernate.type, bạn có thể sử dụng mức DEBUG và nó ghi lại tất cả các tham số. Trong Hibernate 3.5.6 DEBUG là không đủ, bạn phải đặt TRACE, IMHO là ok (một khi bạn biết điều đó) vì nó thực sự ghi lại rất nhiều!
Riccardo Cossu

Tên lớp đã được cấu trúc lại trên Hibernate 4.2 nên để ghi nhật ký giao dịch, bạn phải sử dụng org.hibernate.engine.transaction. Xem: docs.jboss.org/hibernate/orm/4.2/devguide/en-US/html/…
gerrytan

Bạn cũng có thể thêm các logger đến standalone.xml như sau: <logger categoriy = "org.hibernate"> <level name = "DEBUG" /> </ logger>
cw24

1
Nên L, ví dụ, <Logger name="org.hibernate.SQL" level="debug" />thực sự được viết hoa? Tôi nhận được một lỗi trong Tomcat khi khởi động khi viết hoa L: "The content of element type 'log4j:configuration' must match '(renderer*,throwableRenderer*,appender*,plugin*,(category|logger)*,root?,(categoryFactory|loggerFactory)?)'.". Tôi cũng bối rối về cách điều này thực sự nên được nhập vào tệp log4j.xml của tôi. Tôi nên có một <logger>khối riêng biệt cho từng danh mục, hoàn chỉnh với các <level>thẻ, hay tôi có thể loại bỏ các lớp lót mà bạn đã trình bày?
MegaMatt

25

Câu trả lời của Loki chỉ đến 3 tài liệu Hibernate và cung cấp thông tin tốt, nhưng tôi vẫn không nhận được kết quả như mong đợi.

Những cú đập mạnh, vẫy tay và những cú chạy của con chuột chết chung cuối cùng cũng hạ được miếng pho mát của tôi.

Bởi vì Hibernate 3 đang sử dụng Simple Logging Facade cho Java (SLF4J) (theo tài liệu), nếu bạn đang dựa vào Log4j 1.2, bạn cũng sẽ cần slf4j-log4j12-1.5.10.jar nếu bạn muốn định cấu hình đầy đủ tính năng ghi nhật ký Hibernate với tệp cấu hình log4j. Hy vọng điều này sẽ giúp anh chàng tiếp theo.


Đúng vậy, bạn cần slf4j-log4j12-1.5.10.jar để nối mặt tiền vào lớp khai thác bên dưới. Tệp cấu hình vẫn là cấu hình log4j nếu bạn đang sử dụng log4j làm lớp ghi nhật ký.
James McMahon

7

Đáp lại nhận xét của homaxto, đây là những gì tôi có ngay bây giờ.

<?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>

Phần quan trọng là

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

Hi vọng điêu nay co ich.


5

Đây là những gì tôi sử dụng:

<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> 

Rõ ràng là tôi không thích xem các thông báo Hibernate;) - đặt mức thành "debug" để lấy đầu ra.


3

Các câu trả lời rất hữu ích. Sau khi thay đổi, tôi nhận được bản ghi trùng lặp các câu lệnh SQL, một bản ghi trong tệp nhật ký log4j và một bản ghi trên bảng điều khiển tiêu chuẩn. Tôi đã thay đổi tệp Persence.xml nói show_sql thành false để loại bỏ việc ghi nhật ký từ bảng điều khiển tiêu chuẩn. Việc giữ format_sql true cũng ảnh hưởng đến tệp nhật ký log4j, vì vậy tôi đã giữ điều đó đúng.

<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

Bạn có thể định cấu hình log4jtệp của mình bằng thẻ danh mục như thế này (ví dụ với trình ứng dụng bảng điều khiển):

<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>

Vì vậy, mọi cảnh báo, lỗi hoặc thông báo nghiêm trọng từ chế độ ngủ đông sẽ được hiển thị, không có gì hơn. Ngoài ra, mã và mã thư viện của bạn sẽ ở mức thông tin (vì vậy thông tin, cảnh báo, lỗi và nghiêm trọng)

Để thay đổi cấp độ nhật ký của một thư viện, chỉ cần thêm một danh mục, ví dụ, vào nhật ký thông tin mùa xuân hủy hoạt động:

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

Hoặc với một ứng dụng khác, hãy phá vỡ độ cộng (giá trị mặc định của độ cộng thêm là đúng)

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

Và nếu bạn không muốn ghi nhật ký ngủ đông đó cho mọi truy vấn, hãy đặt thuộc tính ngủ đông show_sqlthành false.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.