gpt4 book ai didi

hibernate - 如何在 Hibernate 4 中配置日志记录以使用 SLF4J

转载 作者:行者123 更新时间:2023-12-02 22:00:43 25 4
gpt4 key购买 nike

使用 Hibernate 3.x 用于记录。 Hibernate 4.x 使用 。我正在编写一个独立的应用程序,它使用 Hibernate 4 和 SLF4J 进行日志记录。

如何配置 Hibernate 来登录 SLF4J?

如果不可能,我该如何配置 Hibernate 的日志记录?

Hibernate 4.1 手册 section on logging从警告开始...

Completely out of date. Hibernate uses JBoss Logging starting in 4.0. This will get documented as we migrate this content to the Developer Guide.

...接着讲SLF4J,所以没用。 getting started guide 都不是也不是developer guide完全谈论日志记录。 migration guide 也没有.

我已经查找了有关 jboss-logging 本身的文档,但我根本找不到任何文档。 GitHub page is silent和 JBoss 的 community projects page甚至没有列出 jboss-logging。我想知道该项目是否是 bug tracker可能存在与提供文档相关的任何问题,但事实并非如此。

好消息是,当在应用程序服务器(例如 JBoss AS7)中使用 Hibernate 4 时,日志记录在很大程度上会为您处理。但我如何在独立应用程序中配置它?

最佳答案

查看https://github.com/jboss-logging/jboss-logging/blob/master/src/main/java/org/jboss/logging/LoggerProviders.java :

static final String LOGGING_PROVIDER_KEY = "org.jboss.logging.provider";

private static LoggerProvider findProvider() {
// Since the impl classes refer to the back-end frameworks directly, if this classloader can't find the target
// log classes, then it doesn't really matter if they're possibly available from the TCCL because we won't be
// able to find it anyway
final ClassLoader cl = LoggerProviders.class.getClassLoader();
try {
// Check the system property
final String loggerProvider = AccessController.doPrivileged(new PrivilegedAction<String>() {
public String run() {
return System.getProperty(LOGGING_PROVIDER_KEY);
}
});
if (loggerProvider != null) {
if ("jboss".equalsIgnoreCase(loggerProvider)) {
return tryJBossLogManager(cl);
} else if ("jdk".equalsIgnoreCase(loggerProvider)) {
return tryJDK();
} else if ("log4j".equalsIgnoreCase(loggerProvider)) {
return tryLog4j(cl);
} else if ("slf4j".equalsIgnoreCase(loggerProvider)) {
return trySlf4j();
}
}
} catch (Throwable t) {
}
try {
return tryJBossLogManager(cl);
} catch (Throwable t) {
// nope...
}
try {
return tryLog4j(cl);
} catch (Throwable t) {
// nope...
}
try {
// only use slf4j if Logback is in use
Class.forName("ch.qos.logback.classic.Logger", false, cl);
return trySlf4j();
} catch (Throwable t) {
// nope...
}
return tryJDK();
}

因此,org.jboss.logging.provider的可能值为:jbossjdklog4jslf4j

如果您没有设置org.jboss.logging.provider,它会尝试jboss(确保从类路径中排除相应的jar!),然后是log4j,然后是slf4j(仅当使用logback时)和回退到 jdk。

我将 slf4jlogback-classic 一起使用:

    <dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.0.13</version>
<scope>${logging.scope}</scope>
</dependency>

一切正常!

更新一些用户在非常主要的App.java中使用:

static { //runs when the main class is loaded.
System.setProperty("org.jboss.logging.provider", "slf4j");
}

但对于基于容器的解决方案,这不起作用。

更新 2 那些认为他们使用 SLF4J 来管理 Log4j 来实现 jboss-logging 的人,事实并非如此。 jboss-logging直接使用Log4j,无需SLF4J!

关于hibernate - 如何在 Hibernate 4 中配置日志记录以使用 SLF4J,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11639997/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com