تهيئة عمل log4j يتجاهلها فئات الربيع
سؤال
يمكنني استخدام 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>