Tắt đầu ra của bảng điều khiển ghi nhật ký ngủ đông


84

Tôi đang sử dụng hibernate 3 và muốn ngăn nó kết xuất tất cả các thông báo khởi động vào bảng điều khiển. Tôi đã thử bình luận các dòng stdout trong log4j.properties nhưng không may mắn. Tôi đã dán tệp nhật ký của mình bên dưới. Ngoài ra, tôi đang sử dụng eclipse với cấu trúc dự án tiêu chuẩn và có một bản sao của log4j.properties trong cả thư mục gốc của thư mục dự án và thư mục bin.

### thông báo nhật ký trực tiếp tới stdout ###
# 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

### gửi tin nhắn trực tiếp đến tệp hibernate.log ###
log4j.appender.file = org.apache.log4j.FileAppender
log4j.appender.file.File = hibernate.log
log4j.appender.file.layout = org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern =% d {ABSOLUTE}% 5p% c {1}:% L -% m% n

### đặt cấp độ nhật ký - để ghi nhật ký chi tiết hơn, hãy thay đổi 'thông tin' thành 'gỡ lỗi' ###

log4j.rootLogger = cảnh báo, stdout

# log4j.logger.org.hibernate = thông tin
log4j.logger.org.hibernate = gỡ lỗi

### log hoạt động của trình phân tích cú pháp truy vấn HQL
# log4j.logger.org.hibernate.hql.ast.AST = gỡ lỗi

### chỉ ghi nhật ký SQL
# log4j.logger.org.hibernate.SQL = gỡ lỗi

### log Tham số ràng buộc JDBC ###
log4j.logger.org.hibernate.type = thông tin
# log4j.logger.org.hibernate.type = debug

### xuất / cập nhật giản đồ nhật ký ###
log4j.logger.org.hibernate.tool.hbm2ddl = gỡ lỗi

### log cây phân tích cú pháp HQL
# log4j.logger.org.hibernate.hql = gỡ lỗi

### nhật ký hoạt động trong bộ nhớ cache ###
# log4j.logger.org.hibernate.cache = gỡ lỗi

### ghi lại hoạt động giao dịch
# log4j.logger.org.hibernate.transaction = debug

### log Thu thập tài nguyên JDBC
# log4j.logger.org.hibernate.jdbc = gỡ lỗi

### bật dòng sau nếu bạn muốn theo dõi kết nối ###
### rò rỉ khi sử dụng DriverManagerConnectionProvider ###
# log4j.logger.org.hibernate.connection.DriverManagerConnectionProvider = trac5

2
Đáng nói là Hibernate 4+ sử dụng ghi nhật ký JBOSS.
Eye

Câu trả lời:


77

Cố gắng đặt mức độ ghi nhật ký hợp lý hơn. Thiết lập mức khai thác gỗ để infophương tiện mà chỉ ghi lại sự kiện tại infohoặc cấp cao hơn ( warn, errorfatal) được ghi lại, đó là debugđăng nhập các sự kiện sẽ được bỏ qua.

log4j.logger.org.hibernate=info

hoặc trong phiên bản XML của tệp cấu hình log4j:

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

Xem thêm hướng dẫn sử dụng log4j .


1
Làm cách nào để bạn thực hiện việc này trong phiên bản XML?
James McMahon

Bạn có thể áp dụng điều này cho tất cả các gói trong org.hibernate bằng cách làm như trên hoặc nếu bạn muốn các cấp độ khác nhau cho các gói khác nhau trong chế độ ngủ đông, bạn có thể chỉ định các gói đó theo cùng một cách.
Matthew Brubaker

3
Điều này có vẻ hợp lý, nhưng vẫn không hoạt động đối với tôi (Spring 3.0.5, Hibernate 3.5.6, sf4j-log4j bridge). Tôi vẫn nhận được khoảng 100 dòng nhận xét 'INFO' về khởi động Hibernate mỗi lần. Vì vậy, điều này có thể không hiệu quả với tất cả mọi người.
Joseph Lust vào

1
@Twisted Pear: đặt cấp độ ghi nhật ký của bạn thành CẢNH BÁO. Sau đó, bạn sẽ không nhận được tin nhắn INFO.
Juha Syrjälä

5
Theo dõi vì điều này chưa bao giờ được giải quyết thỏa đáng: Hibernate, thậm chí vẫn ở phiên bản 4.3.0.Final, có rất nhiều System.out.println()lệnh gọi được mã hóa cứng .
chrylis -cautilyoptimistic-

85

Thông báo quan trọng: thuộc tính (một phần của cấu hình ngủ đông, KHÔNG phải một phần của cấu hình khung ghi nhật ký!)

hibernate.show_sql

kiểm soát việc ghi nhật ký trực tiếp đến STDOUT bằng cách bỏ qua bất kỳ khuôn khổ ghi nhật ký nào (mà bạn có thể nhận ra bằng cách định dạng đầu ra bị thiếu của các thông báo). Nếu bạn sử dụng khung ghi nhật ký như log4j, bạn nên luôn đặt thuộc tính đó thành false vì nó không mang lại lợi ích gì cho bạn.

Hoàn cảnh đó đã làm tôi khó chịu trong một thời gian dài vì tôi chưa bao giờ thực sự quan tâm đến nó cho đến khi tôi cố gắng viết một số điểm chuẩn về Hibernate.


2
Tôi phải đặt thuộc tính này trong hibernate.xmlcấu hình Hibernate (tức là ), trái ngược với cấu hình ghi nhật ký của tôi. Cảm ơn vì con trỏ!
JJ Zabkar

có cách nào để ghi nhật ký này không vượt qua khuôn khổ ghi nhật ký của tôi mà thực sự sử dụng nó không? Tôi thấy một số ngoại lệ được gửi đến stdout mà tôi muốn ghi lại.
Legna

1
Với dự án khởi động mùa xuân của tôi, tôi đã thêm điều này vào tệp conf YML hồ sơ. Nhưng nó không hoạt động, giống như những người khác đăng trên chủ đề này ... Nhật ký ngủ đông tiếp tục được ghi bất kể tôi chỉ định gì. Nó có thể được xử lý ở nơi nào khác ngoài cấu hình Logback, tệp yaml ứng dụng và pom.xml không?
Alex

33

Đang thực hiện:

java.util.logging.Logger.getLogger("org.hibernate").setLevel(Level.OFF);

trước khi quá trình khởi tạo của hibernate hoạt động với tôi.


Lưu ý: dòng trên sẽ tắt mọi đăng nhập ( Level.OFF). Nếu bạn muốn bớt khắt khe hơn, bạn có thể sử dụng

java.util.logging.Logger.getLogger("org.hibernate").setLevel(Level.SEVERE);

vậy là đủ im lặng. (Hoặc kiểm tra java.util.logging.Levellớp học để biết thêm cấp độ).


1
Điều này làm việc cho tôi:java.util.logging.Logger.getLogger("org.hibernate").setLevel(Level.SEVERE);
RafiAlhamd

16

Bạn có thể vô hiệu hóa nhiều đầu ra của chế độ ngủ đông cài đặt đạo cụ ngủ đông (cấu hình hb) này là false:

hibernate.show_sql
hibernate.generate_statistics
hibernate.use_sql_comments

Nhưng nếu bạn muốn vô hiệu hóa tất cả thông tin bảng điều khiển, bạn phải đặt cấp độ ghi nhật ký là KHÔNG CÓ CHẤT BÉO của lớp org.hibernatenhư Juha nói.


Điều gì sẽ xảy ra nếu tôi muốn tạo thống kê, nhưng không ghi nhật ký?
markthegrea

7

Cuối cùng tôi đã tìm ra, đó là vì Hibernate đang sử dụng mặt tiền log của slf4j, để kết nối với log4j, bạn cần đặt các lọ log4j và slf4j-log4j12 vào lib của bạn và sau đó các thuộc tính log4j sẽ kiểm soát các bản ghi Hibernate.

Cài đặt pom.xml của tôi trông như sau:

    <dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
        <version>1.2.16</version>
    </dependency>

    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-log4j12</artifactId>
        <version>1.6.4</version>
    </dependency>

Trên thực tế, bạn có thể thực hiện Hibernate sử dụng slf4j một cách rõ ràng bằng cách thêm -Dorg.jboss.logging.provider=slf4jvào các tùy chọn VM của bạn. Tôi đã viết một bài báo về chủ đề: medium.com/@scadge/how-to-enable-hibernate-logging-dc11545efd3d
Scadge vào

5

Để tắt Hibernate:selectthông báo trong nhật ký, có thể đặt thuộc tính thành HibernateJpaVendorAdapter:

<bean id="jpaVendorAdapter"
    class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
    <property name="showSql" value="false"/>
</bean> 

4

Đối với những người không muốn các giải pháp thanh lịch, chỉ là một cách nhanh chóng và bẩn thỉu để ngăn chặn các thông báo đó, đây là một giải pháp phù hợp với tôi (Tôi sử dụng Hibernate 4.3.6 và Eclipse và không có câu trả lời nào được cung cấp ở trên (hoặc tìm thấy trên internet) đã hoạt động; cả tệp cấu hình log4j cũng như thiết lập mức ghi nhật ký theo chương trình)

public static void main(String[] args) {
    //magical - do not touch
    @SuppressWarnings("unused")
    org.jboss.logging.Logger logger = org.jboss.logging.Logger.getLogger("org.hibernate");
    java.util.logging.Logger.getLogger("org.hibernate").setLevel(java.util.logging.Level.WARNING); //or whatever level you need

    ...
}

Tôi đã sử dụng nó trong một chương trình hướng dẫn được tải xuống từ trang web này


3

Điều đầu tiên cần làm là tìm ra khung ghi nhật ký nào thực sự được sử dụng.

Nhiều khuôn khổ đã được đề cập bởi các tác giả khác ở trên. Trong trường hợp bạn đang sử dụng Logback, bạn có thể giải quyết vấn đề bằng cách thêm logback.xml này vào classpath của mình:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <logger name="org.hibernate" level="WARN"/>
</configuration>

Thông tin khác: Logback Manual-Configuration


1

Tôi đã thay đổi "gỡ lỗi" thành "thông tin" và nó đã hoạt động. Đây là những gì tôi đã làm:

Trước:

log4j.rootLogger=debug, stdout, R

Sau:

log4j.rootLogger=info, stdout, R 


0

Để loại bỏ đầu ra của trình ghi nhật ký trong bảng điều khiển, hãy thử điều này.

ch.qos.logback.classic.LoggerContext.LoggerContext loggerContext = (LoggerContext) org.slf4j.LoggerFactory.LoggerFactory.getILoggerFactory();

loggerContext.stop();

Các câu lệnh này đã vô hiệu hóa tất cả các kết quả đầu ra của bảng điều khiển từ trình ghi nhật ký.


0

Có một số phần của ghi nhật ký ngủ đông mà bạn có thể kiểm soát dựa trên phân cấp trình ghi nhật ký của gói ngủ đông (thêm về phân cấp trình ghi nhật ký tại đây ).

    <!-- Log everything in hibernate -->
    <Logger name="org.hibernate" level="info" additivity="false">
      <AppenderRef ref="Console" />
    </Logger>

    <!-- Log SQL statements -->
    <Logger name="org.hibernate.SQL" level="debug" additivity="false">
      <AppenderRef ref="Console" />
      <AppenderRef ref="File" />
    </Logger>

    <!-- Log JDBC bind parameters -->
    <Logger name="org.hibernate.type.descriptor.sql" level="trace" additivity="false">
      <AppenderRef ref="Console" />
      <AppenderRef ref="File" />
    </Logger>

Ở trên được lấy từ đây .

Ngoài ra, bạn có thể có thuộc tính show-sql:truetrong tệp cấu hình của mình vì nó thay thế cài đặt khung ghi nhật ký. Thêm về điều đó ở đây .


0

Tôi đã cố gắng dừng lại bằng cách thêm 2 dòng đó

log4j.logger.org.hibernate.orm.deprecation=error

log4j.logger.org.hibernate=error

Dưới đây là giao diện log4j.properties của tôi , tôi chỉ để lại một số dòng nhận xét giải thích cấp độ nhật ký

# Root logger option
#Level/rules TRACE < DEBUG < INFO < WARN < ERROR < FATAL.
#FATAL: shows messages at a FATAL level only
#ERROR: Shows messages classified as ERROR and FATAL
#WARNING: Shows messages classified as WARNING, ERROR, and FATAL
#INFO: Shows messages classified as INFO, WARNING, ERROR, and FATAL
#DEBUG: Shows messages classified as DEBUG, INFO, WARNING, ERROR, and FATAL
#TRACE : Shows messages classified as TRACE,DEBUG, INFO, WARNING, ERROR, and FATAL
#ALL : Shows messages classified as TRACE,DEBUG, INFO, WARNING, ERROR, and FATAL
#OFF : No log messages display


log4j.rootLogger=INFO, file, console

log4j.logger.main=DEBUG
log4j.logger.org.hibernate.orm.deprecation=error
log4j.logger.org.hibernate=error

#######################################
# Direct log messages to a log file
log4j.appender.file.Threshold=ALL
log4j.appender.file.file=logs/MyProgram.log
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} %-5p %c{1} - %m%n

# set file size limit
log4j.appender.file=org.apache.log4j.RollingFileAppender
log4j.appender.file.MaxFileSize=5MB
log4j.appender.file.MaxBackupIndex=50


#############################################
# Direct log messages to System Out
log4j.appender.console.Threshold=INFO
log4j.appender.console.Target=System.out
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%d{HH:mm:ss} %-5p %c{1} - %m%n
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.