คุณกำหนดค่าการบันทึกใน Hibernate 4 เพื่อใช้ SLF4J ได้อย่างไร


114

ใช้ไฮเบอร์เนต 3.x สำหรับการบันทึก ไฮเบอร์เนตใช้ 4.x. ฉันกำลังเขียนแอปพลิเคชันแบบสแตนด์อโลนซึ่งใช้ Hibernate 4 และ SLF4J สำหรับการบันทึก

ฉันจะกำหนดค่า Hibernate เพื่อเข้าสู่ SLF4J ได้อย่างไร

หากไม่สามารถทำได้ฉันจะกำหนดค่าการบันทึกของไฮเบอร์เนตได้อย่างไร

ส่วนคู่มือ Hibernate 4.1 เกี่ยวกับการบันทึกเริ่มต้นด้วยคำเตือนว่าเป็น ...

ล้าสมัยโดยสิ้นเชิง Hibernate ใช้ JBoss Logging ตั้งแต่ 4.0 สิ่งนี้จะได้รับการจัดทำเป็นเอกสารเมื่อเราย้ายเนื้อหานี้ไปยังคู่มือสำหรับนักพัฒนา

... พูดถึง SLF4J ต่อไปก็ไม่มีประโยชน์ ทั้งคู่มือเริ่มต้นใช้งานหรือคู่มือสำหรับนักพัฒนาซอฟต์แวร์ไม่ได้พูดถึงการบันทึกเลย หรือไม่คำแนะนำการโยกย้าย

ฉันได้ค้นหาเอกสารเกี่ยวกับ jboss-logging แล้ว แต่ไม่พบเลย หน้า GitHub จะเงียบและ JBoss ของหน้าโครงการชุมชนไม่ได้แม้กระทั่งรายการ JBoss การเข้าสู่ระบบ ฉันสงสัยว่าตัวติดตามข้อบกพร่องของโครงการอาจมีปัญหาใด ๆ เกี่ยวกับการจัดเตรียมเอกสาร แต่ก็ไม่ได้

ข่าวดีก็คือเมื่อใช้ Hibernate 4 ภายในแอปพลิเคชันเซิร์ฟเวอร์เช่น JBoss AS7 การบันทึกจะได้รับการดูแลเป็นอย่างดีสำหรับคุณ แต่ฉันจะกำหนดค่าในแอปพลิเคชันแบบสแตนด์อโลนได้อย่างไร?


13
+1 สำหรับการเน้นว่าเอกสาร Hibernate ในการบันทึกนั้นล้าสมัย
mhnagaoka

หนึ่งสามารถตั้งค่าคุณสมบัติของระบบ org.jboss.logging.provide = slf4j สำหรับรายละเอียดเพิ่มเติมโปรดไปที่ลิงค์docs.jboss.org/hibernate/orm/4.3/topical/html/logging/…สำหรับเวอร์ชันจำศีลที่มากกว่า 3
Abhishek Ranjan

คำตอบ:


60

ไปที่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 จากนั้น log4j แล้วก็ slf4j (เฉพาะเมื่อใช้ logback) และทางเลือกกลับเป็น jdk

ฉันใช้slf4jกับlogback-classic:

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

และทำงานได้ดี!

UPDATEผู้ใช้บางคนใช้ใน App.java หลัก ๆ :

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

แต่สำหรับโซลูชันที่ใช้คอนเทนเนอร์จะไม่ได้ผล

UPDATE 2ผู้ที่คิดว่าตัวเองจัดการ Log4j กับ SLF4J jboss-loggingนั้นไม่ถูกต้อง jboss-loggingใช้ Log4j โดยตรงโดยไม่ใช้ SLF4J!


1
ตั้งตรงไหนorg.jboss.logging.provider?
Suzan Cioc

1
@SuzanCioc ตามที่System.getProperty(LOGGING_PROVIDER_KEY);คุณต้องการตั้งค่าคุณสมบัติของระบบ ผ่านjava -D...=...หรือตรวจสอบเอกสารสำหรับคอนเทนเนอร์ของคุณ
gavenkoa

1
การอัปเดตครั้งที่สองของคุณเกี่ยวกับการไม่สามารถใช้ log4j ผ่าน slf4j นั้นมีประโยชน์ การตั้งค่า org.jboss.logging.provider เป็น slf4j ทำให้ฉันคิดว่าการสนับสนุน log4j ของฉันจะเริ่มต้นขึ้น แต่ก็ไม่ได้เป็นเช่นนั้น ฉันต้องตั้งค่านั้นเป็น log4j โดยตรงเพื่อให้ใช้งานได้ แปลก slf4j เป็นตัวเลือกสำหรับ config นี้คืออะไร?
Travis Spencer

27

ที่จะได้รับ SLF4J ในการทำงานกับ JBoss เข้าสู่ระบบโดยไม่ต้อง Logback org.jboss.logging.provider=slf4jเป็นแบ็กเอนด์ต้องมีการใช้งานของสถานที่ให้บริการระบบ log4j-over-slf4jกลยุทธ์ดูเหมือนจะไม่ได้ผลในกรณีนี้เนื่องจากการบันทึกจะถอยกลับไปที่ JDK หากไม่มี Logback หรือ log4j ใน classpath

นี่เป็นความรำคาญเล็กน้อยและเพื่อให้การตรวจจับอัตโนมัติทำงานได้คุณจะเห็นว่า classloader มีอย่างน้อย ch.qos.logback.classic.Loggerจาก logback-classic หรือorg.apache.log4j.Hierarchyจาก log4j เพื่อหลอกให้ JBoss Logging ไม่ถอยกลับไปที่การบันทึก JDK

ความมหัศจรรย์ถูกตีความที่ org.jboss.logging.LoggerProviders

อัปเดต: เพิ่มการรองรับตัวโหลดบริการดังนั้นจึงเป็นไปได้ที่จะหลีกเลี่ยงปัญหาเกี่ยวกับการตรวจจับอัตโนมัติโดยการประกาศMETA-INF/services/org.jboss.logging.LoggerProvider(โดยorg.jboss.logging.Slf4jLoggerProviderมีค่าเป็นค่า) ดูเหมือนว่าจะมีการเพิ่มการสนับสนุน log4j2 ด้วย


1
ฉันจะตั้งค่าคุณสมบัติของระบบนี้ได้ที่ไหน
jhegedus

ขึ้นอยู่กับการตั้งค่าของคุณ แต่โดยปกติสวิตช์บรรทัดคำสั่ง-Dorg.jboss.logging.provider=slf4jก็เพียงพอแล้ว LoggingProviders.javaให้ข้อมูลเชิงลึกที่ดีขึ้นว่าค่าที่ยอมรับในปัจจุบันคืออะไรและคาดว่าจะมีอยู่ใน classpath
Tuomas Kiviaho

2
ฉันไม่คิดว่าวิธีการโหลดบริการใช้ได้ผลเพราะSlf4jLoggerProviderไม่ใช่publicคลาส?
holmis83

ฉันต้องการตั้งค่า org.jboss.logging.provider ใน weblogic WAR ลงในซอร์สโค้ด แต่ Intiializer คลาสคงที่จะถูกเรียกใช้หลังจาก LoggingProviders หนึ่ง!
อันโตนิโอ Petricca

12

แรงบันดาลใจจากโพสต์ Hypoport ของ Leifนี่คือวิธีที่ฉัน "งอ" Hibernate 4 กลับไปที่ slf4j:

สมมติว่าคุณใช้ Maven

  • เพิ่มorg.slf4j:log4j-over-slf4jการพึ่งพาให้กับไฟล์pom.xml
  • ใช้คำสั่งmvn dependency:treeตรวจสอบให้แน่ใจว่าไม่มีสิ่งประดิษฐ์ที่คุณใช้ขึ้นอยู่slf4j:slf4j(เพื่อให้แม่นยำไม่มีสิ่งประดิษฐ์ใดที่ต้องมีการพึ่งพาขอบเขตการคอมไพล์หรือการพึ่งพาขอบเขตรันไทม์slf4j:slf4j )

พื้นหลัง: Hibernate 4.x org.jboss.logging:jboss-loggingมีการพึ่งพาสิ่งประดิษฐ์ที่ สกรรมกริยาสิ่งประดิษฐ์นี้มีจัดไว้ให้พึ่งพาขอบเขตในสิ่งประดิษฐ์slf4j:slf4jพึ่งพาขอบเขตในสิ่งประดิษฐ์

เนื่องจากตอนนี้เราได้เพิ่มorg.slf4j:log4j-over-slf4jArtifact แล้วให้org.slf4j:log4j-over-slf4jเลียนแบบslf4j:slf4jArtifact เพราะฉะนั้นทุกอย่างนั้นJBoss Loggingบันทึกจะไปผ่าน slf4j

สมมติว่าคุณใช้Logbackเป็นแบ็กเอนด์การบันทึกของคุณ นี่คือตัวอย่างpom.xml

<?xml version="1.0" encoding="UTF-8"?>
<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/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>

    ....
    <properties>
        ....
        <slf4j-api-version>1.7.2</slf4j-api-version>
        <log4j-over-slf4j-version>1.7.2</log4j-over-slf4j-version>
        <jcl-over-slf4j-version>1.7.2</jcl-over-slf4j-version> <!-- no problem to have yet another slf4j bridge -->
        <logback-core-version>1.0.7</logback-core-version>
        <logback-classic-version>1.0.7</logback-classic-version>
        <hibernate-entitymanager-version>4.1.7.Final</hibernate-entitymanager-version> <!-- our logging problem child -->
    </properties>

    <dependencies>
            <!-- begin: logging-related artifacts .... -->
            <dependency>
                <groupId>org.slf4j</groupId>
                <artifactId>slf4j-api</artifactId>
                <version>${slf4j-api-version}</version>
            </dependency>
            <dependency>
                <groupId>org.slf4j</groupId>
                <artifactId>jcl-over-slf4j</artifactId>
                <version>${jcl-over-slf4j-version}</version>
            </dependency>
            <dependency>
                <groupId>org.slf4j</groupId>
                <artifactId>log4j-over-slf4j</artifactId>
                <version>${log4j-over-slf4j-version}</version>
            </dependency>   
            <dependency>
                <groupId>ch.qos.logback</groupId>
                <artifactId>logback-core</artifactId>
                <version>${logback-core-version}</version>
            </dependency>
            <dependency>
                <groupId>ch.qos.logback</groupId>
                <artifactId>logback-classic</artifactId>
                <version>${logback-classic-version}</version>
            </dependency>
            <!-- end: logging-related artifacts .... -->

            <!-- begin: some artifact with direct dependency on log4j:log4j ....  -->
            <dependency>
            <groupId>org.foo</groupId>
                <artifactId>some-artifact-with-compile-or-runtime-scope-dependency-on-log4j:log4j</artifactId>
                <version>${bla}</version>
                <exclusions>
                    <exclusion>
                        <groupId>log4j</groupId>
                        <artifactId>log4j</artifactId>
                    </exclusion>
                </exclusions>   
            </dependency>
            <!-- begin: some artifact with direct dependency on log4j:log4j ....  -->

            <!-- begin: a hibernate 4.x problem child........... -->
            <dependency>
                <groupId>org.hibernate</groupId>
                <artifactId>hibernate-entitymanager</artifactId>
                <version>${hibernate-entitymanager-version}</version>
            </dependencies>
            <!-- end: a hibernate 4.x problem child........... -->
    ....
</project>

บน classpath ของคุณมีlogback.xmlเช่นนี้อยู่ในsrc/main/java:

<!-- begin: logback.xml -->
<configuration>
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
        <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
    </encoder>
</appender> 

<logger name="org.hibernate" level="debug"/>

<root level="info">
    <appender-ref ref="console"/>
</root>

</configuration>
<!-- end: logback.xml -->

ส่วนประกอบบางอย่างอาจต้องการเข้าถึงในlogback.xmlเวลาเริ่มต้นของ JVM เพื่อการบันทึกที่เหมาะสมตัวอย่างเช่นปลั๊กอิน Jetty Maven ในกรณีนั้นให้เพิ่มระบบ Java logback.configurationFile=./path/to/logback.xmlในคำสั่งของคุณ (เช่นmvn -Dlogback.configurationFile=./target/classes/logback.xml jetty:run)

ในกรณีที่คุณยังคงได้รับเอาต์พุตคอนโซล "ดิบ" stdout ไฮเบอร์เนต (เช่นHibernate: select ...) อาจใช้คำถาม Stack Overflow " ปิดการบันทึกไฮเบอร์เนตไปที่คอนโซล "


1
ตรวจสอบให้แน่ใจว่าไม่มีไอคอนไลบรารีอื่นรวมถึง log4j มิฉะนั้นจะไม่ทำงาน ตัวอย่าง: activemq-all.jar มี log4j คำแนะนำ: เปิด IDE ของคุณและค้นหา log4j ได้อย่างง่ายดายในรหัสของคุณ
Dimitri Dewaele

ฉันมีปัญหากับ JBoss Hibernate4 และเซิร์ฟเวอร์เก่า (เกินไป) โพสต์นี้รวมถึง 1 บรรทัดใน application.properties ทำเคล็ดลับสำหรับฉัน TNX เลย !!! และบรรทัดสุดท้ายในคุณสมบัติของฉันเขียนไว้ในคำตอบอื่นที่นี่:org.jboss.logging.provider=slf4j
Jeroen van Dijk-Jun

8

ก่อนอื่นคุณต้องทราบว่า SLF4J ไม่ใช่ไลบรารีการบันทึกที่ถูกต้องมันเป็นกระดาษห่อบันทึก ตัวมันเองไม่ได้บันทึกอะไรเลยเพียงแค่มอบหมายให้ "แบ็กเอนด์"

ในการ "กำหนดค่า" jboss-logging คุณเพียงแค่เพิ่ม log framework ใด ๆ ก็ตามที่คุณต้องการใช้บน classpath ของคุณ (พร้อมกับ jboss-logging) และ jboss-logging จะคำนวณส่วนที่เหลือ

ฉันสร้างคำแนะนำที่เน้นไฮเบอร์เนตสำหรับการกำหนดค่าการบันทึก JBoss: http://docs.jboss.org/hibernate/orm/4.3/topical/html/logging/Logging.html


2
ฉันรู้ว่า SLF4J เป็นส่วนหน้าใช่ การส่งการบันทึกไฮเบอร์เนตไปที่ SLF4J หมายความว่าจะลงเอยที่แบ็กเอนด์ใดก็ได้ที่ฉันเลือกไว้สำหรับแอปพลิเคชันที่เหลือซึ่งเป็นสิ่งที่ฉันต้องการ
Tom Anderson

10
ดังนั้นสิ่งที่คุณกำลังพูดเกี่ยวกับการกำหนดค่าก็คือไม่มีการกำหนดค่า (ซึ่งดีมาก!) แต่การบันทึก jboss นั้นตรวจพบและเลือกแบ็กเอนด์ได้อย่างไร? อ่าตอนนี้ผมใช้เวลาในการดูจริงรหัสที่ผมเห็นว่าเป็นสิ่งที่เกิดขึ้น โดยเฉพาะอย่างยิ่งการบันทึก jboss จะพยายามตามลำดับคือ JBoss LogManager, log4j, Logback ผ่าน SLF4J และการบันทึก JDK แต่สิ่งนี้สามารถแทนที่ได้ด้วยorg.jboss.logging.providerคุณสมบัติของระบบ
Tom Anderson

2
พวกเราหลายคนถูกไฟไหม้จากการเข้าสู่ระบบคอมมอนส์คิดหาสิ่งต่างๆให้คุณดังนั้นการรู้ว่าการทำงานของ jboss-logging นั้นสำคัญมากแค่ไหนในการสนับสนุนมันในโลกแห่งความเป็นจริงเมื่อสิ่งที่ไม่คาดคิดเกิดขึ้น
AMS

1
ลิงค์ด้านบนแสดงให้เห็นว่าจะเกิดอะไรขึ้นถ้านั่นคือสิ่งที่คุณต้องการเห็นจริงๆดังนั้นอย่าทำตาม ...
Steve Ebersole

3

ฉันใช้ Hibernate Core 4.1.7 Final plus Spring 3.1.2 รีลีสในแอปแบบสแตนด์อโลน ฉันเพิ่ม Log4j 1.2.17 ในการอ้างอิงของฉันและดูเหมือนว่าเมื่อ JBoss Logging บันทึกโดยตรงไปยัง log4j หากมีและ Spring ใช้ Commons Logging แม่มดยังใช้ Log4j หากมีการบันทึกทั้งหมดสามารถกำหนดค่าผ่าน Log4J ได้

นี่คือรายการการอ้างอิงที่เกี่ยวข้องของฉัน:

<dependency>
    <groupId>log4j</groupId>
    <artifactId>log4j</artifactId>
    <version>1.2.17</version>
</dependency>
<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-core</artifactId>
    <version>4.1.7.Final</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>3.1.2.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-orm</artifactId>
    <version>3.1.2.RELEASE</version>
</dependency>

3

ดังนั้นจึงใช้งานได้ในโครงการของฉัน จำศีล 4, slf4j, logback โครงการของฉันเป็นแบบ gradle แต่ควรจะเหมือนกันสำหรับ maven

โดยพื้นฐานแล้วอับดุลพูดถูก ที่เขาไม่ถูกต้องคือคุณไม่ต้องลบ slf4j จากการอ้างอิง

  1. รวมเพื่อรวบรวมขอบเขต:

    org.slf4j: slf4j-API

    org.slf4j: log4j-over-slf4j

    เช่น logback (ch.qos.logback: logback-classic, ch.qos.logback: logback-core: 1.0.12)

  2. ยกเว้น log4j libs จากการอ้างอิงโดยสิ้นเชิง

ผลลัพธ์: ไฮเบอร์เนตบันทึกผ่าน slf4j เพื่อล็อกแบ็ก แน่นอนว่าคุณควรจะสามารถใช้การใช้งานบันทึกที่แตกต่างจากการบันทึกย้อนกลับได้

เพื่อให้แน่ใจว่าไม่มี log4j อยู่ให้ตรวจสอบ libs ของคุณบน classpath หรือ web-inf / lib สำหรับไฟล์ war

แน่นอนคุณได้ตั้งค่าคนตัดไม้ใน logback.xml เช่น:

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


มีปัญหานี้แน่นอน log4j ถูกนำเข้ามาเป็นการพึ่งพาสกรรมกริยาจากไลบรารีอื่น ไม่รวมมันและการบันทึกไฮเบอร์เนตเริ่มทำงานตามที่คาดไว้โดยใช้การบันทึกย้อนกลับและสะพาน slf4j log4j
Paul Zepernick

3

Hibernate 4.3 มีเอกสารเกี่ยวกับวิธีการควบคุมorg.jboss.logging:

  • มันค้นหาระดับเส้นทางสำหรับผู้ให้บริการการเข้าสู่ระบบ มันค้นหา slf4j หลังจากค้นหา log4j ดังนั้นตามทฤษฎีแล้วการตรวจสอบให้แน่ใจว่า classpath (WAR) ของคุณไม่มี log4j และรวมถึง slf4j API และแบ็คเอนด์ควรใช้งานได้

  • เป็นที่พึ่งสุดท้ายคุณสามารถตั้งค่าระบบทรัพย์สินไปorg.jboss.logging.providerslf4j


แม้จะมีการอ้างสิทธิ์ในเอกสาร แต่org.jboss.loggingยืนยันที่จะพยายามใช้ log4j แม้ว่าจะไม่มี log4j และมี SLF4J อยู่ก็ตามส่งผลให้มีข้อความต่อไปนี้ในไฟล์บันทึก Tomcat ของฉัน ( /var/log/tomcat/catalina.out):

 log4j:WARN No appenders could be found for logger (org.jboss.logging).
 log4j:WARN Please initialize the log4j system properly.
 log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.

ฉันต้องทำตามข้อเสนอแนะของคำตอบโดยdasAnderl ausMingaและรวมlog4j-over-slf4jสะพาน


2

ฉันใช้ maven และเพิ่มการอ้างอิงต่อไปนี้:

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

จากนั้นฉันสร้างlog4j.propertiesไฟล์ใน/src/main/resources:

# direct log messages to 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
# set log levels
log4j.rootLogger=warn

สิ่งนี้จะวางไว้ที่รากของ.jarไฟล์. ใช้งานได้เหมือนมีเสน่ห์ ...


3
สิ่งนี้กำหนดการใช้ log4j OP ไม่ต้องการใช้ log4j; พวกเขาต้องการใช้ slf4j
Raedwald

1

ฉันมีปัญหาในการทำให้การบันทึกไฮเบอร์เนต 4 ทำงานกับ weblogic 12c และ log4j วิธีแก้ปัญหาคือใส่สิ่งต่อไปนี้ใน weblogic-application.xml ของคุณ:

<prefer-application-packages>
    <package-name>org.apache.log4j.*</package-name>
    <package-name>org.jboss.logging.*</package-name>
</prefer-application-packages>

0

สำหรับทุกคนที่สามารถเผชิญกับปัญหาเดียวกันกับฉัน ในกรณีที่คุณได้ลองใช้วิธีแก้ปัญหาอื่น ๆ ทั้งหมดที่อธิบายไว้ที่นี่แล้วและยังไม่เห็นว่าการบันทึกไฮเบอร์เนตทำงานกับ slf4j ของคุณอาจเป็นเพราะคุณใช้คอนเทนเนอร์ที่มีในโฟลเดอร์ไลบรารี jboss-logging.jar ซึ่งหมายความว่าจะได้รับการโหลดไว้ล่วงหน้าก่อนที่คุณจะสามารถตั้งค่าใด ๆ ให้มีผลกับมันได้ เพื่อหลีกเลี่ยงปัญหานี้ใน weblogic คุณสามารถระบุในไฟล์ weblogic-application.xml ใน ear ของคุณ / META-INF เพื่อต้องการไลบรารีที่โหลดจากแอปพลิเคชัน ควรมีกลไกที่คล้ายกันสำหรับคอนเทนเนอร์เซิร์ฟเวอร์อื่น ๆ ในกรณีของฉันฉันต้องเพิ่ม:

<?xml version="1.0" encoding="UTF-8"?>
<wls:weblogic-application xmlns:wls="http://xmlns.oracle.com/weblogic/weblogic-application" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/javaee_5.xsd http://xmlns.oracle.com/weblogic/weblogic-application http://xmlns.oracle.com/weblogic/weblogic-application/1.5/weblogic-application.xsd">
   <wls:prefer-application-packages>    
       <!-- logging -->
       <wls:package-name>org.slf4j.*</wls:package-name>
       <wls:package-name>org.jboss.logging.*</wls:package-name>             
   </wls:prefer-application-packages>
   <wls:prefer-application-resources>
        <wls:resource-name>org/slf4j/impl/StaticLoggerBinder.class</wls:resource-name>
    </wls:prefer-application-resources>     
</wls:weblogic-application>

-2

คุณลองทำสิ่งนี้:

- slf4j-log4j12.jar ในกรณีของ Log4J ดูเอกสาร SLF4J สำหรับรายละเอียดเพิ่มเติม ในการใช้ Log4j คุณจะต้องวางไฟล์ log4j.properties ใน classpath ของคุณด้วย ไฟล์คุณสมบัติตัวอย่างถูกแจกจ่ายด้วย Hibernate ในไดเร็กทอรี src /

เพียงแค่เพิ่ม jar และคุณสมบัติเหล่านี้หรือ log4j xml ใน classpath


4
นั่นคือใบเสนอราคาจากเอกสาร Hibernate 3.x คุณคิดว่าจะยังใช้งานได้กับ Hibernate 4.x ซึ่งไม่ใช้ SLF4J หรือไม่?
Tom Anderson

เท่าที่ฉันจำ log4j ก็เพียงพอแล้ว
Avihai Marchiano
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.