log4net काम नहीं कर रहा है


123

अरे मैं अपने web.config में इस विन्यास है

<log4net>
    <appender name="LogFileAppender" type="log4net.Appender.FileAppender">
        <param name="File" value="mylog.log" />
        <param name="AppendToFile" value="true" />
        <layout type="log4net.Layout.PatternLayout">
            <param name="Header" value="" />
            <param name="Footer" value="" />
            <param name="ConversionPattern" value="%d [%t] %-5p %m%n" />
        </layout>
    </appender>
    <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender" >
        <layout type="log4net.Layout.PatternLayout">
            <param name="Header" value="[Header]\r\n" />
            <param name="Footer" value="[Footer]\r\n" />
            <param name="ConversionPattern" value="%d [%t] %-5p %m%n" />
        </layout>
    </appender>
    <root>
        <level value="DEBUG" />
        <appender-ref ref="LogFileAppender" />
        <appender-ref ref="ConsoleAppender" />
    </root>
</log4net>

लेकिन log4net काम नहीं कर रहा है। मेरी परियोजना ठीक संकलित करती है, और मुझे डिबगिंग में कोई त्रुटि नहीं मिलती है। जहाँ मैं बताता हूँ कि लाइनें log.debug("somemessage")ठीक हैं, लेकिन मैं mylog.logफ़ाइल नहीं ढूँढ सकता , तो यह कहाँ है?


इसे भी ज़रूर देखें: stackoverflow.com/a/24617269/114029
Leniel Maccaferri

जवाबों:


298

इस प्रकार की चीज़ों के लिए एक गोत्र XmlConfiguratorको निम्नलिखित पंक्ति को अपने पास रखकर विधानसभा में विशेषता जोड़ना सुनिश्चित करना है AssemblyInfo.cs:

[assembly: log4net.Config.XmlConfigurator]

अन्यथा log4net कभी सक्रिय नहीं होता है।


5
इस विधि का इस्तेमाल किया अपने प्रोजेक्ट में काम करने के लिए है, लेकिन यह किसी भी तरह काम करना बंद कर। मुझे इसे फिर से काम करने के लिए इस विधि stackoverflow.com/a/1479343/193634 का उपयोग करना पड़ा ।
रोजडी कासिम

मैंने बस फिर से कोशिश की और यह ठीक काम करता है। सबसे अधिक संभावना है कि आप असेंबली को संदर्भित / लोड नहीं कर रहे हैं जिसमें AssemblyInfoआप जैसे ही सोचा था।
Kirk Woll

ELMAH ऐपेंडर का उपयोग करने वालों के लिए यह जाने का रास्ता है। मेरे पास 'log4net.Config.XmlConfigurator.Configure ();' in global.asax.cs और यह फ़ाइल परिशिष्ट के लिए ठीक काम कर रहा था, लेकिन ELMAH परिशिष्ट के लिए नहीं।
user3885927

मैंने इस उत्तर पर टिक किया है और पाया है कि मुझे इसके साथ जुड़ने की आवश्यकता है [विधानसभा: log4net.Config.XmlConfigurator (देखें = सत्य)] `
डेविड सैवेज

49

मुझे लगता है कि या तो log4net लॉगिंग नहीं कर रहा है, या जहाँ आप यह अपेक्षा करते हैं वह फ़ाइल समाप्त नहीं हो रही है।

सबसे पहले, क्या आपने वास्तव में कॉल किया है

XmlConfigurator.Configure()

आपके कोड में कहीं भी? यदि ऊपर xml स्निपेट एप्लिकेशन कॉन्फ़िगरेशन फ़ाइल में है, तो यह कॉल चाल करेगा। यदि xml स्निपेट स्वयं की फ़ाइल में है, तो आपको फ़ाइल .Configure(string)पर पथ ले जाने वाले अधिभार का उपयोग करना होगा। इस कॉल के बिना (या जाहिर तौर पर किर्क वोले द्वारा बताई गई असेंबली लेवल की विशेषता), तो log4net लॉगिंग नहीं होगी।

यदि आपको लगता है कि यह सब हो चुका है, और log4net लॉगिंग होना चाहिए, तो हो सकता है कि आपको आगे डीबग करते समय लॉग फ़ाइल के लिए पूरी तरह से योग्य पथ डालना चाहिए। यह आपको सुनिश्चित करेगा कि फ़ाइल कहाँ होनी चाहिए।


33

एक और छोटा गोचा है, यहाँ देखें: http://log.apache.org/log4net/release/manual/configuration.html#dot-config

[assembly: log4net.Config.XmlConfigurator]विधि app.config साथ काम नहीं करता। यदि आप app.config से log4net को कॉन्फ़िगर करते हैं, तो आपको log4net.Config.XmlConfigurator.Configure()विधि का उपयोग करना होगा ।


सिर्फ रिकॉर्ड के लिए, दोनों तरीकों ने मेरे लिए कंसोल एप्लिकेशन में काम किया।
रागित

मैं उपरोक्त समाधान की पुष्टि करता हूं - मुझे log4net.Config.XmlConfigurator.Configure () को आमंत्रित करना था; मेरे कोड में (जो log4net को प्रभावी ढंग से काम करने के लिए app.config का उपयोग करता है। लाइनें जो प्रभावी रूप से मुद्रित होती हैं, वे
कंफिगर

19

यहाँ मेरा चेकलिस्ट है जब log4net रिकैलिट्रेंट साबित हो रहा है:

  • यह सुनिश्चित करें कि log4net.config फ़ाइल का निर्माण होने पर बिन \ फ़ोल्डर में कॉपी किया जाता है (संकलक में 'यदि नया है तो कॉपी करें' पर सेट)
    • इंस्टॉल कोड के साथ काम करते समय, सुनिश्चित करें कि log4net.config सवारी के लिए आया था (संकलक में 'सामग्री' पर सेट)
  • यह सुनिश्चित करें कि प्रक्रिया के रूप में चलने वाले उपयोगकर्ता के पास उस फ़ोल्डर के राइट्स हैं जहां लॉग लिखा जाना है
  • यदि संदेह है, तो सी: \ temp \ को उचित अनुमति दें और वहां लॉग इन करने के लिए सब कुछ प्राप्त करें ()
  • यह देखने के लिए कि क्या आपको कुछ बताता है, Sysinternal / Dbgview.exe को आग लगा दें

3
"सुनिश्चित करें कि log4net.config फ़ाइल का निर्माण होने पर बिन \ फ़ोल्डर में कॉपी किया जाता है (संकलक में 'यदि नया है तो कॉपी करें" पर सेट करें) -> मेरा दिन बचाएं! बहुत सोचता है!
होआंग गुयेन हू

8

एक ASP.NET MVC प्रोजेक्ट जोड़ने के लिए

log4net.Config.XmlConfigurator.Configure();

Global.asax.cs में भी मदद करता है:

public class MvcApplication : System.Web.HttpApplication
{
    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();

        WebApiConfig.Register(GlobalConfiguration.Configuration);
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        BundleConfig.RegisterBundles(BundleTable.Bundles);
        AuthConfig.RegisterAuth();

        log4net.Config.XmlConfigurator.Configure();
    }
}

1
उत्पादन और मेरे बॉस के कंप्यूटर पर इस के साथ एक बहुत ही अजीब मुद्दा था, लकड़हारे इस तरह से ठीक काम करते थे, लेकिन तब तक नहीं जब तक कि कर्क के उत्तर ने मेरे कंप्यूटर पर काम नहीं किया। बस मैंने सोचा कि मैं लोगों को इस मामले में (एमवीसी प्रोजेक्ट btw) समान मुद्दों के बारे में बताऊंगा।
शेल्बी ११५

@ Shelby115, बहुत बहुत धन्यवाद! मैं ELMAH में अपनी log4Net प्रविष्टियाँ डालने का प्रयास कर रहा था। मेरे पास web.config में सब कुछ सही था। मेरे पास पहले से ही 'log4net.Config.XmlConfigurator.Configure ();' मेरे Global.asax.cs में लेकिन यह काम नहीं करेगा। इस एसओ पोस्ट पर आया और किर्क के आधार पर असेंबलीइन्फो.इनके लिए लाइन जोड़ी। यह अभी भी काम नहीं किया !. आपकी टिप्पणी पढ़ने के बाद मैंने Global.asax.cs से पिछली प्रविष्टि को हटा दिया और इसने काम करना शुरू कर दिया। मैंने इस पर कई घंटे बिताए और आपकी टिप्पणी एक बड़ी मदद थी। एक बार फिर धन्यवाद!
user3885927

Global.asax.cs में प्रविष्टि फ़ाइल परिशिष्ट के लिए ठीक काम कर रही थी, लेकिन ELMAH परिशिष्ट के लिए नहीं। कर्क का रास्ता ELMAH ऐपेंडर के लिए काम करता है (मुझे विशेष रूप से इसे
वैश्विक

आप यह भी सुनिश्चित कर सकते हैं कि log4net लॉग फ़ाइलों के लिए कॉन्फ़िगर की गई निर्देशिका के लिए अनुमतियाँ लिखें।
ओलादिपो ओलासेमो

@ शेल्बी ११५ डांग, इसे तब पसंद करेंगे जब आप समाधान भूल जाते हैं और आपकी अपनी टिप्पणी आपकी समस्या को हल करती है। आपके द्वारा पहले से ही अप-डाउन किए गए उत्तर वाले पृष्ठ पर आना एक अच्छा संकेतक है।
शेल्बी ११५

7

ये वो चरण हैं जो अंततः मेरी फ़ाइल लॉगिंग को काम कर रहे हैं:

  • -Check AssemblyInfo.cs में निम्नलिखित विशेषता है। [विधानसभा: log4net.Config.XmlConfigurator] । यह log4net लोड करता है।
  • लॉग निर्देशिका की जाँच करें अनुमतियाँ लिखें।
  • जाँचें कि लकड़हारा एक प्रारूप निर्दिष्ट करता है। यह आपके कॉन्फ़िगरेशन में प्रत्येक तत्व की जांच करके किया गया है जिसमें एक लेआउट तत्व निर्दिष्ट है। उदाहरण के लिए:

<appender name="MainLogger"... <layout type="log4net.Layout.SimpleLayout"/>

  • अंत में, कंसोल लॉगिंग और कंसोल की जांच करने में सक्षम करने के लिए log4net आंतरिक लॉगिंग चालू करने का प्रयास करें। ऐसा करने के लिए, <add key="log4net.Internal.Debug" value="true"/>अपने में जोड़ें appSettings

<कुंजी जोड़ें "= log4net.Internal.Debug" value = "true" /> इससे मुझे समस्या का निवारण करने में मदद मिली। धन्यवाद
रवि खम्भाती

निर्देशिका की अनुमति मुझे क्या मिली
उमर हिमादा

6

मेरे पास अनुभव हैं कि लॉगिंग सिस्टम अपवादों को उठाए बिना चुपचाप विफल रहता है। मुझे लगता है कि यह समझ में आता है क्योंकि यदि लकड़हारा त्रुटियों को लॉग कर रहा है तो वह त्रुटि कैसे दर्ज कर सकता है कि वह लॉगिंग करने में असमर्थ है?

तो अगर फ़ाइल डिस्क पर नहीं बनाया गया है, से शुरू फाइल सिस्टम अनुमतियों की जांच कर रहे उपयोगकर्ता अपने आवेदन के तहत चल रहा है डिस्क स्थान के लिए एक नई फ़ाइल लिख सकते हैं सुनिश्चित करने के लिए।

परीक्षण उद्देश्यों के लिए आप डिस्क पर फ़ाइल मैन्युअल रूप से बनाना चाहते हैं जिसे लिखा जाना चाहिए और इसे लिखने के लिए हर किसी के लिए अनुमतियाँ खोलनी चाहिए। यदि लकड़हारा इसे लिखना शुरू कर देता है तो आपको पता है कि यह कॉन्फ़िगरेशन आधारित होने के बजाय अनुमति आधारित है।


2

मेरी ओर से, मैं एप्लिकेशन को संकलित करते समय कॉपी की जाने वाली कॉन्फ़िग फ़ाइल को चिह्नित करना भूल गया।

आउटपुट डायरेक्टरी में कॉन्फिग फाइल को कॉपी करें

बस राइट क्लिक करें log4net.config फ़ाइल, संपत्ति का चयन करें और फिर कॉपी XXXX होने के लिए आउटपुट निर्देशिका में प्रतिलिपि चुनें


1

मैंने उपरोक्त सभी की कोशिश की लेकिन कुछ भी काम नहीं किया। इस लाइन को app.config के configSections सेक्शन में जोड़ना मेरे लिए काम करता है।

<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net, Version=1.2.15.0, Culture=neutral, PublicKeyToken=669e0ddf0bb1aa2a" />

सुनिश्चित करें कि Versionऔर PublicKeyTokenसही है


0
<param name="File" value="mylog.log" />

कह रहा है "वास्तविक फ़ोल्डर में mylog.log लिखें"। इसका अर्थ है कि यदि आपका वेब आईआईएस के अंतर्गत है, तो लॉग को C: \ inetpub \ wwwroot \ appname \ mylog.log पर लिखा जाएगा।

यदि लॉग फ़ाइल नहीं है, तो हो सकता है कि जिस ऐप के तहत ऐप चल रहा है, उसमें फ़ोल्डर पर लिखने की अनुमति न हो। आप यह देख सकते हैं कि किसी फ़ाइल को लिखा गया है या नहीं, यह देखने के लिए आप SysInternals से प्रोसेस मॉनिटर चला सकते हैं।

डीएस को डिबग मोड में भी चलाएं, यह देखने के लिए कि क्या कोई अपवाद फेंका गया है (डिबग-> अपवाद-> सीएलआर अपवाद, जांच फेंको)।


0

मेरे मामले में मैं "सामग्री" के रूप में log4Net.config फ़ाइल गुणों को सेट करना भूल जाता हूं, इसलिए फ़ाइल को तैनाती में शामिल नहीं किया गया था। तो इस पर ध्यान दें:

Compile action : Content

0

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

string assemblyFolder = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
log4net.Config.XmlConfigurator.Configure(new FileInfo(assemblyFolder + "/log4net.config"));

-7

इसके अलावा कुछ घंटों के बाद, मुझे लगा कि यह मेरे लिए काम क्यों नहीं कर रहा है ...

मैं था:

public static class Program
{

    private static CommunicationManager _bcScanner = new CommunicationManager();
    private static ILog _log = LogManager.GetLogger(typeof(Program));
    private static SocketServer socketListener;

लेकिन यह होना चाहिए:

public static class Program
    {
        private static ILog _log = LogManager.GetLogger(typeof(Program));
        private static CommunicationManager _bcScanner = new CommunicationManager();
        private static SocketServer socketListener;

तो सुनिश्चित करें कि ILog पहली पंक्ति में है ...।


1
यह निश्चित रूप से कारण नहीं है। इससे कोई फर्क नहीं पड़ता कि आप ILog ऑब्जेक्ट को तब तक इनिशियलाइज़ करते हैं जब तक आप लॉगिंग मेथड्स यानी _log.Info पर कॉल करते हैं; _log.error आदि
Oladipo Olasemo
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.