2010-12-09 9 views
30

मेरे पास एक वेब ऐप है जो मेरे लॉग 4 जे लॉग फैक्ट्री को शुरू करने के लिए स्प्रिंग की Log4jConfigurer कक्षा का उपयोग करता है। असल में यह लॉग 4 जे को कॉन्फ़िगरेशन फ़ाइल के साथ प्रारंभ करता है जो कक्षा पथ से बाहर है।वसंत के साथ Log4J शुरू करना?

<bean id="log4jInitializer" class="org.springframework.beans.factory.config.MethodInvokingFactoryBean" depends-on="sbeHome"> 
    <property name="targetClass" value="org.springframework.util.Log4jConfigurer" /> 
    <property name="targetMethod" value="initLogging" /> 
    <property name="arguments"> 
     <list> 
      <value>#{ MyAppHome + '/conf/log4j.xml'}</value> 
     </list> 
    </property> 
</bean> 

हालांकि मैं स्टार्टअप पर यह त्रुटि प्राप्त:

log4j:WARN No appenders could be found for logger

और स्प्रिंग आवेदन संदर्भ प्रारंभ संदेशों के टन कंसोल के लिए मुद्रित कर रहे हैं

यहाँ config है। मुझे लगता है कि ऐसा इसलिए है क्योंकि वसंत मेरे लॉगर को शुरू करने का मौका देने से पहले मेरे आवेदन को शुरू करने के लिए काम कर रहा है। यदि यह महत्वपूर्ण है, तो मैं Log4J के शीर्ष पर SLF4J का उपयोग कर रहा हूं।

क्या कोई तरीका है कि मैं अपना लॉग 4jConfigurer प्रारंभ करने वाला पहला बीन बन सकता हूं? या क्या इसे हल करने का कोई और तरीका है?

उत्तर

47

आप वसंत-context.xml

<context-param> 
    <param-name>log4jConfigLocation</param-name> 
    <param-value>/WEB-INF/classes/log4j.web.properties</param-value> 
</context-param> 

<listener> 
    <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class> 
</listener> 

तो यह निर्भर है से पहले वसंत शुरू होता है के बजाय web.xml में अपने log4j श्रोता कॉन्फ़िगर कर सकते हैं।

+0

मुझे यह उल्लेख करना चाहिए था कि log4J गुण फ़ाइल का मेरा पथ एक जेएनडीआई स्ट्रिंग से आ रहा है। मैं उस जेएनडीआई मूल्य को पर कैसे आपूर्ति कर सकता हूं। अगर मैं ऐसा कर सकता हूं, तो मुझे लगता है कि मैं पूरी तरह से तैयार हूं। – HDave

+4

मैं इस पाया है: http://www.coderanch.com/t/362833/Servlets/java/log-ServletContextListener - यह कैसे अपनी खुद की log4j विन्यास श्रोता जो मैं अपने ही बनाया JNDI – Ralph

+0

से कुछ जानकारी प्राप्त लागू करने के लिए पता चलता सर्वलेट संदर्भ श्रोता जैसे उन्होंने किया और यह सब पूरी तरह से काम करता है। धन्यवाद। – HDave

4

बजाय

-Dlog4j.configuration=.../conf/log4j.xml 
अपने सर्वर की स्टार्टअप गुणों के

जोड़कर कोड में log4j को विन्यस्त अपने आप को, क्यों सिर्फ अपने (कस्टम) विन्यास फाइल के स्थान पर log4j इंगित नहीं?

यहां तक ​​कि बेहतर, बस log4j.xml को डिफ़ॉल्ट स्थान पर ले जाएं - क्लासपाथ पर - और log4j स्वचालित रूप से स्वयं को कॉन्फ़िगर करें।

+4

मैं लॉग 4j फ़ाइल को WAR के बाहर रखने की कोशिश कर रहा हूं ताकि हम समस्या निदान के लिए आवश्यकतानुसार ग्राहक को आसानी से ट्विक कर सकें। JVM प्रॉपर्टी के रूप में, वर्तमान में हमारे पास स्टार्टअप स्क्रिप्ट भी नहीं है। ग्राहक सिर्फ WAR फ़ाइल को तैनात करते हैं और जाते हैं। – HDave

+0

कुछ मामलों में हम रास्ते पर "फाइल" उपसर्ग जोड़ने चाहिए में '-Dlog4j.configuration = फ़ाइल: conf/log4j.properties' –

+0

@matt ख कृपया स्पष्ट classpath अनुक्रम scanninng – gstackoverflow

8

हमारे स्वतंत्र अनुप्रयोग एक SMTPAppender आवश्यक जहां ईमेल config पहले से ही एक spring कॉन्फ़िग फ़ाइल में मौजूद है और हम चाहते हैं कि log4j.properties में दोहराया जा करने के लिए नहीं चाहता था।

मैंने वसंत का उपयोग करके एक अतिरिक्त एपेंडर जोड़ने के लिए निम्नलिखित को एक साथ रखा।

<bean class="org.springframework.beans.factory.config.MethodInvokingFactoryBean"> 
    <property name="targetObject"> 
     <bean factory-method="getRootLogger" 
       class="org.apache.log4j.Logger" /> 
    </property> 
    <property name="targetMethod"> 
     <value>addAppender</value> 
    </property> 
    <property name="arguments"> 
     <list> 
      <bean init-method="activateOptions" 
        class="org.apache.log4j.net.SMTPAppender"> 
       <property name="SMTPHost" ref="mailServer" /> 
       <property name="from" ref="mailFrom" /> 
       <property name="to" ref="mailTo" /> 
       <property name="subject" ref="mailSubject" /> 
       <property value="10" name="bufferSize" /> 
       <property name="layout"> 
        <bean class="org.apache.log4j.PatternLayout"> 
         <constructor-arg> 
          <value>%d, [%5p] [%t] [%c] - %m%n</value> 
         </constructor-arg> 
        </bean> 
       </property> 
       <property name="threshold"> 
        <bean class="org.springframework.beans.factory.config.FieldRetrievingFactoryBean" 
          id="org.apache.log4j.Priority.ERROR" /> 
       </property> 
      </bean> 
     </list> 
    </property> 
</bean> 

हम भी classpath जो हमारे नियमित FileAppenders विवरण पर एक log4j.properties फ़ाइल है।

मुझे पता है इस overkill क्या आप :)

1

की आवश्यकता होती है आप जेट्टी उपयोग कर रहे हैं यदि आप एक प्रति आवेदन के आधार पर अतिरिक्त classpaths जोड़ सकते हैं के लिए हो सकता है:

http://wiki.eclipse.org/Jetty/Reference/Jetty_Classloading#Adding_Extra_Classpaths_to_Jetty

यह करने के लिए आप की अनुमति देगा

 <listener> 
      <listener-class>org.springframework.web.util.Log4jWebConfigurer</listener-class> 
     </listener> 
     <context-param> 
      <param-name>log4jConfigLocation</param-name> 
      <param-value>classpath:${project.artifactId}-log4j.properties</param-value> 
     </context-param> 
: (classpath :)

web.xml में

से एक मानक तरीके से अपने log4 गुण लोड

घाट-web.xml में:

 <Set name="extraClasspath"> 
      <SystemProperty name="config.home" default="."/>/contexts/log4j 
     </Set> 
1

आप हार्डकोडेड पथ के बजाय classpath उपयोग कर सकते हैं।यह मेरे लिए काम करता है

<bean id="log4jInitializer" class="org.springframework.beans.factory.config.MethodInvokingFactoryBean" depends-on="sbeHome"> 
    <property name="targetClass" value="org.springframework.util.Log4jConfigurer" /> 
    <property name="targetMethod" value="initLogging" /> 
    <property name="arguments"> 
     <list> 
      <value>classpath:/conf/log4j.xml</value> 
     </list> 
    </property> 
</bean> 
+0

कि इतना महान था! धन्यवाद ! – Hatem

+0

इस समाधान के साथ एक यूआरएल का उपयोग कर संभव है? –

संबंधित मुद्दे