سؤال

يمكنني استخدام log4j وهو يعمل بشكل جيد. يوجد ملف log4j.xml في ClassPath الخاص بي ، أستخدم Appender and Category ... مرة أخرى ، إنه يعمل بشكل جيد للرمز أو رمز المكتبة الأخرى.

لكن فصول الربيع تستمر في إغراق stdout بالرسالة التي أريد تسجيلها في مكان آخر. من الساد أن تكون anoying.

رسالة مسيئة: org.springframework.jms: بعض الأخطاء .... بشكل عام ، جميع فئات حزمة org.springframework إرسال رسالة إلى stdout.

لذلك أضع هذا في log4j.xml الخاص بي:

<appender name="JMS-ERROR" class="org.apache.log4j.RollingFileAppender">
    <param name="File" value="tms.logs.folder/tms.logs.files.prefix-jms-error.log"/>
    <param name="Append" value="true"/>
    <param name="MaxFileSize" value="1000KB"/>
    <param name="MaxBackupIndex" value="2"/>
    <layout class="org.apache.log4j.PatternLayout">
        <param name="ConversionPattern" value="**DVIDEA** %d{dd.MM.yyyy HH:mm:ss} %c  %m%n"/>
    </layout>
    <filter class="org.apache.log4j.varia.LevelRangeFilter">
        <param name="LevelMin" value="DEBUG" />
        <param name="LevelMax" value="FATAL" />
    </filter>
</appender>


<category name="org.springframework.jms" additivity="false">
    <appender-ref ref="JMS-ERROR"/>
</category>

إنه يعمل مع Librairie الأخرى. لماذا لا الربيع؟

أقوم ببعض الأبحاث ، ويبدو أن الربيع يستخدم الغطس المشترك ، وليس log4j. هل هذا سبب ممكن؟ أي حل؟

لقد حاولت إضافة log4jconfigurationListener إلى web.xml. إنه يعمل لكنني لا أملك أي تحكم في رسالة خطأ الربيع.

<context-param>
   <param-name>log4jConfigLocation</param-name>
   <param-value>classpath:log4j.xml</param-value>
</context-param>
<context-param>
   <param-name>log4jRefreshInterval</param-name>
   <param-value>10000</param-value>
</context-param>
<listener>
   <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
</listener>

تعديل :

المزيد من المعلومات:

  • أستخدم Tomcat 5.5
  • لا يزال موقع log4j.property (Config log4j القديم) موجودًا لسبب تاريخي. أحاول إزالته => لا تغيير.

تحرير 2: أستخدم الحلول التالية ، لكنني لست سعيدًا به: إنه غير قابل للتكوين

java.util.logging.Logger springLogger = Logger.getLogger("org.springframework.jms");
springLogger.setLevel(Level.OFF);

لا يوجد حل صحيح

نصائح أخرى

لاحظ أنه في عينات الربيع ، يستخدمون SLF4J لتوجيه رسائل السجل من تسجيلات العموم إلى Log4J. في مافن pom.xml يبدو بهذه الطريقة:

<!-- Exclude Commons Logging -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>org.springframework.context</artifactId>
    <version>${spring.version}</version>
    <exclusions>
        <!-- Exclude Commons Logging in favor of SLF4j -->
        <exclusion>
            <groupId>org.apache.commons</groupId>
            <artifactId>com.springsource.org.apache.commons.logging</artifactId>
        </exclusion>
    </exclusions>
</dependency>

<!-- Add slf4j API -->
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>com.springsource.slf4j.api</artifactId>
    <version>${slf4j.version}</version>
</dependency>

<!-- Add Commons Logging -> slf4j bridge -->
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>com.springsource.slf4j.org.apache.commons.logging</artifactId>
    <version>${slf4j.version}</version>
    <scope>runtime</scope>
</dependency>

<!-- Add slf4j -> log4j bridge -->
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>com.springsource.slf4j.log4j</artifactId>
    <version>${slf4j.version}</version>
    <scope>runtime</scope>
</dependency>

قد تحتاج:

<bean id="log4jInitialization"
    class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
        <property name="targetClass"
            value="org.springframework.util.Log4jConfigurer" />
        <property name="targetMethod" value="initLogging" />
        <property name="arguments">
            <list>
                <value>conf/log4j.xml</value>
            </list>
        </property>
    </bean>

يستخدم الربيع تسجيل أسعار Apache Commons ، والذي بدوره يقرر ما إذا كان سيتم استخدام stdout (عبر java.util.logging) أو log4j. إذا كنت تحصل على إخراج الربيع على STDOUT ، فإن Commons-Logging لم تقم بتحديد موقع Log4J لسبب ما.

إذا قمت بتعيين خاصية النظام org.apache.commons.logging.diagnostics.dest, ، يمكن تكوين خطوط العموم لتسجيل تشخيصاتها ، وإخبارك بالخطوات التي تتخذها لتحديدها في Log4J.

لذلك في البرنامج النصي لبدء تشغيل Tomcat ، قم بتعيين خاصية النظام ، على سبيل المثال

-Dorg.apache.commons.logging.diagnostics.dest=STDOUT

يجب عليك استخدام SLF4J ، وتضمين الجسر إلى منصة التسجيل التي تريدها (log4j) ولكن يجب عليك ايضا استبعاد المشاع من جميع الأماكن الأخرى التي قد يتم سحبها. من المفيد أن يكون هناك IDE للقيام بذلك ، أو يمكنك وضع إدخال وهمية في التراجع عن العموم. للحصول على تفاصيل حول ذلك ، راجع SLF4J الأسئلة الشائعة

الإجابة السابقة المذكورة باستخدام القطع الأثرية com.springsource ، ولكن إذا كنت تستخدم Maven Central ، فإن الطريقة الصحيحة للقيام بذلك هي:

<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-log4j12</artifactId>
    <version>1.7.10</version>
</dependency>
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
    <version>1.7.10</version>
</dependency>
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top