log4j: WARN web.xml में लकड़हारे के लिए कोई ऐपेंडर नहीं मिला


80

मैंने पहले ही log4jConfigLocation को web.xml में डाल दिया है, लेकिन मुझे अभी भी निम्नलिखित चेतावनी मिलती है:

log4j:WARN No appenders could be found for logger ⤦
    ⤥ (org.springframework.web.context.ContextLoader).
log4j:WARN Please initialize the log4j system properly.

मुझसे क्या छूट गया?

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" 
    "java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>
            /WEB-INF/applicationContext.xml
        </param-value>
    </context-param>
    <context-param>
        <param-name>log4jConfigLocation</param-name>
        <param-value>/WEB-INF/classes/log4j.properties</param-value>
    </context-param>

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

    <servlet>
        <servlet-name>suara2</servlet-name>
        <servlet-class>
            org.springframework.web.servlet.DispatcherServlet
        </servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>suara2</servlet-name>
        <url-pattern>/*</url-pattern>
    </servlet-mapping>
</web-app>

जवाबों:


43

यदि वह संपूर्ण log4j.properties फ़ाइल है तो ऐसा लगता है कि आप वास्तव में कोई लकड़हारा नहीं बना रहे हैं। आपको एक लाइन की आवश्यकता है जैसे:

log4j.rootLogger=debug,A1

1
@ काफ़िएन: ऐसा लगता है कि यह आप ही हैं जो पूरा सवाल नहीं पढ़ रहे हैं (इस मामले में लेखक की टिप्पणियों में से एक सवाल उस जानकारी को प्रदान करता है जिसके लिए उत्तर संदर्भित होता है)। @CodeGoat: सभी टिप्पणियों को पढ़ने के लिए +1।
फ्रांसिस्को अल्वाराडो

@FranciscoAlvarado मैं log4j.propertiesक्लास पथ में फ़ाइल है, फिर भी कंसोल में प्रदर्शित करता है।
उदयकिरण पुलिपति

29

मेरे पास classpath में सही जगह log4j.properties था और अभी भी इसे सीधे इस्तेमाल करने वाली किसी भी चीज़ के साथ यह चेतावनी मिली थी। कॉमन्स-लॉगिंग के माध्यम से log4j का उपयोग कर कोड किसी कारण से ठीक लग रहा था।

यदि आपके पास है:

log4j.rootLogger=WARN

इसे इसमें बदलें:

log4j.rootLogger=WARN, console
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.conversionPattern=%5p [%t] (%F:%L) - %m%n

Http://log.apache.org/log4j/1.2/manual.html के अनुसार :

रूट लॉगर अनाम है, लेकिन Logger.getRootLogger () विधि से एक्सेस किया जा सकता है। रूट से जुड़ा कोई डिफॉल्ट ऐपेंडर नहीं है।

इसका मतलब यह है कि आपको लॉग करने के लिए रूट लकड़हारे के लिए कुछ परिशिष्ट, किसी भी परिशिष्ट को निर्दिष्ट करने की आवश्यकता है।

RootLogger में कंसोल कंसोल जोड़ने से यह शिकायत गायब हो जाती है।


1
मैं यह कहां से चिपका सकता हूं।
उदयकिरण पुलिपति

@udaykiranpulipati आप इसे log4j.properties में पेस्ट कर सकते हैं। यदि आपके पास log4j.properties नहीं है, तो इसे src / main / resource में बनाएँ / यदि SBT / Gradle / Maven / etc का उपयोग करें। अन्यथा इसे कहीं रख दें कि यह क्लासपाथ की जड़ (शायद src /) में समाप्त हो जाएगा।
एलैन ओ'डे

19

जब आपको यह त्रुटि मिल सकती है log4j.propertiesक्लासपाथ में मौजूद नहीं ।

इसका मतलब है कि आपको log4j.propertiessrc फोल्डर में जाना होगा और आउटपुट को बिन फोल्डर पर सेट करना log4j.propertiesहोगा ताकि रन टाइम पर बिन फोल्डर से रीड हो जाए और आपकी त्रुटि आसानी से हल हो जाएगी।


1
मुझे डेस्कटॉप एप्लिकेशन (एप्लेट) में भी यही समस्या है। फ़ाइल log4j.properties पहले से ही src फ़ोल्डर में है। मैं "बिन फ़ोल्डर में आउटपुट कैसे सेट करूं"?
दिलशाद राणा

7

अगर आपको लॉग 4j कहीं भी "log4j.properties" या "log4j.xml" फाइल नहीं मिल रही है तो आप यह चेतावनी देखेंगे।


2
मैं पुष्टि करता हूं कि स्थान सही है। coz जब मैं log4j.properties का नाम दूसरे नाम पर रखता हूं, तो यह त्रुटि देती है
cometta

7

या, आप कर सकते हैं कि मैंने क्या किया और लॉग कॉन्फ़िगरेशन फ़ाइल लोड होने से पहले लकड़हारे को परिभाषित करें। यह वैसा ही होगा जैसा वे कहते हैं: "घोड़े के आगे गाड़ी रखना।"

कोड में:

public static Logger logger = Logger.getLogger("RbReport");

... बाद में

PropertyConfigurator.configure(l4j);
logger = Logger.getLogger("RbReport");

कॉन्फ़िगरेशन लोड होने के बाद लकड़हारा को प्रारंभ करना था।

गीक्स के लिए यह "पुटिंग डेसकेर्ट बी 4 डी घोड़ा" था।


5

यदि आप स्वसंपूर्ण log4j अनुप्रयोगों के लिए कॉन्फ़िगर करना चाहते हैं, तो आप BasicConfigurator का उपयोग कर सकते हैं। यह समाधान वसंत पर्यावरण जैसे वेब अनुप्रयोगों के लिए अच्छा नहीं होगा।

आपको लिखने की जरूरत है-

BasicConfigurator.configure();

या

ServletContext sc = config.getServletContext();
String log4jLocation = config.getInitParameter("log4j-properties-location");
String webAppPath = sc.getRealPath("/");
String log4jProp = webAppPath + log4jLocation;
PropertyConfigurator.configure(log4jProp);

4

यदि अभी भी मदद करते हैं, तो संग्रह के नाम को सत्यापित करें, यह सटीक होना चाहिए "log4j.properties" या "log4j.xml" (मामला संवेदनशील), और "Alain O'Dea" द्वारा संकेत का पालन करें। मुझे वही त्रुटि मिल रही थी, लेकिन इन बदलावों के बाद कुछ भी ठीक काम करता है। बस एक आकर्षण की तरह :-)। उम्मीद है की यह मदद करेगा।


3

मेरे मामले में समाधान आसान था। आपको अपने में कुछ भी घोषित करने की आवश्यकता नहीं है web.xml

चूँकि आपका प्रोजेक्ट एक वेब अनुप्रयोग है, WEB-INF/classesपरिनियोजन के बाद कॉन्फ़िग फ़ाइल चालू होनी चाहिए । मैं आपको एक जावा संसाधन फ़ोल्डर ( src/main/resources) बनाने के लिए सलाह देता हूं कि (सबसे अच्छा pratice)। एक अन्य तरीका यह है कि आप कॉन्फिग फाइल को अपने अंदर रखें src/main/java

कॉन्फ़िगरेशन फ़ाइल नाम से सावधान रहें। यदि आप XML का उपयोग कर रहे हैं, तो फ़ाइल नाम है log4j.xml, अन्यथा log4j.properties


2

इन पंक्तियों को web.xml की शुरुआत में रखें:

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

आपको लॉग 4jConfigLocation निर्दिष्ट करने की आवश्यकता नहीं है। यह क्लासपाथ से ले जाएगा।
कृष्णा

क्या आपने वर्गों फ़ोल्डर के अंदर xml फ़ाइल जोड़ी है?
कृष्णा

मेरा log4j src / main / resource / log4j.xml के अंतर्गत है (मैं src / min / Resources / META-INF / spring / एकीकरण / spring-एकीकरण-Reference.xml के तहत स्प्रिंग इंटीग्रेशन और मेरे कॉन्फिग फाइलिस का उपयोग कर रहा हूं)
MariemJab

वर्गपथ के तहत संसाधन फ़ोल्डर?
कृष्ण

1

ठीक है, मुझे बहुत उत्तर और कुछ बहुत सही दिखाई दे रहे हैं। हालाँकि, किसी ने भी मेरी समस्या तय नहीं की। मेरे मामले में समस्या यह थी कि UNIX फाइल सिस्टम अनुमतियों के पास log4j.properties फ़ाइल थी जो कि मैं सर्वर पर रूट के स्वामित्व में संपादित कर रहा था। और केवल मूल द्वारा पठनीय। हालाँकि, मैं जिस वेब एप्लिकेशन पर तैनाती कर रहा था, वह उस फ़ाइल को नहीं पढ़ सका, जो कि टॉमकैट के रूप में चलता है, क्योंकि उपयोगकर्ता टॉमकैट को डिफ़ॉल्ट रूप से लिनक्स सिस्टम पर चलाता है। उम्मीद है की यह मदद करेगा। इसलिए समाधान 'chown tomcat: tomcat log4j.properties' टाइप कर रहा था, जहां निर्देशिका में log4j.properties फ़ाइल रहती है।


1

अपने web.xml में log4jExposeWebAppRoot -> को जोड़ें। यह मेरे साथ काम करता है :)

<context-param>
    <param-name>log4jConfigLocation</param-name>
    <param-value>path/log4j.properties</param-value>
</context-param>
<context-param>
    <param-name>log4jExposeWebAppRoot</param-name>
    <param-value>false</param-value>
</context-param>
<listener>
    <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
</listener>

0

मुझे भी यही समस्या थी । समान कॉन्फ़िगरेशन सेटिंग्स और समान चेतावनी संदेश। मेरे लिए क्या काम किया गया था: प्रविष्टियों के क्रम को बदलना।

  • मैंने लॉग कॉन्फिगरेशन के लिए प्रविष्टियां [संदर्भ पैरा और श्रोता] फाइल के शीर्ष पर [ApplicationContext.xml] के लिए प्रविष्टि से पहले रखी और यह काम कर गया।

आदेश मायने रखता है, मुझे लगता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.