คุณกำหนดค่าการบันทึกใน 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.