बाहरी फ़ाइल में Log4Net कॉन्फ़िगरेशन काम नहीं करता है


92

हम log4net का उपयोग कर रहे हैं और यह निर्दिष्ट करना चाहते हैं कि यह बाहरी कॉन्फ़िगरेशन फ़ाइल में कॉन्फ़िगरेशन है (जैसा कि हमने अन्य अनुभागों के साथ किया है)। ऐसा करने के लिए हमने App.config में log4net सेक्शन को बदल दिया है:

...
<section name="log4net" 
     type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
...
<log4net configSource="Log.config" />
...

और Log.Config फ़ाइल में (App.config के समान निर्देशिका) हमारे पास है:

<log4net>
  <appender name="General" type="log4net.Appender.FileAppender">
    <file value="myapp.log" />
    <layout type="log4net.Layout.SimpleLayout" />
  </appender>
  <root>
    <appender-ref ref="General" />
  </root>
</log4net>

हालाँकि, जब हम ऐप चलाते हैं, तो कोई लॉग फ़ाइल नहीं बनाई जाती है (और कोई लॉगिंग नहीं की जाती है)। कंसोल के लिए कोई त्रुटि संदेश आउटपुट नहीं हैं।

यदि हम Log.config फ़ाइल की सामग्री को App.config (ऊपर पहली कोड लाइन की जगह) में स्थानांतरित करते हैं, तो यह अपेक्षित रूप से काम करता है। किसी भी विचार क्यों यह एक बाहरी फ़ाइल में काम नहीं कर रहा है?


मैं उसी समस्या में भाग गया - हमने संभवतः उसी (गलत-निर्देशित) गाइड का अनुसरण किया!
जैच बर्लिंगम

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

जवाबों:


112

क्या आपकी AssemblyInfo.csफ़ाइल में निम्नलिखित विशेषता है :

[assembly: log4net.Config.XmlConfigurator(ConfigFile = "Log4Net.config", Watch = true)]

और प्रत्येक कोड की शुरुआत में इस तरह का कोड जिसे लॉगिंग कार्यक्षमता की आवश्यकता होती है:

private static readonly ILog log = 
LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);

मेरे पास एक ब्लॉग पोस्ट है जिसमें यह और अन्य जानकारी है


17
यह काम करता है, तो सुनिश्चित करें कि यदि आप "हमेशा के लिए" पर "आउटपुट निर्देशिका में कॉपी" संपत्ति सेट करने के लिए log4net.config फ़ाइल बनाते हैं।
ई। वैन डेर स्पोएल

@mitchwheat बिलकुल भगवान की तरह, मैं एक निन्यानबे आधारित समाधान के साथ जूझ रहा हूँ, यह ठीक करने के लिए कि यह सारा दिन क्या करता है ... आदमी!
युद्ध

39

इस मुद्दे पर एक खुला दोष है । Log4Net कॉन्फ़िगरेशन तत्वों के configSource विशेषता का समर्थन नहीं करता है। विशुद्ध रूप से कॉन्फ़िगरेशन फ़ाइल समाधान का उपयोग करने के लिए आप appSettings में log4net.Config कुंजी का उपयोग करें।

चरण 1: सामान्य कॉन्फ़िगरेशन अनुभाग परिभाषा को शामिल करें:

<configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
</configSections>

चरण 2: appSettings में जादू log4net.Config कुंजी का उपयोग करें।

<appSettings>
      <add key="log4net.Config" value="log4net.simple.config" />
</appSettings>

चरण 3: configSource की हैंडलिंग को ठीक करने के लिए एक पैच योगदान करें।


5
Log4net.Config.XmlConfigurator.Configure () के लिए एक कॉल; इसके साथ इस मुद्दे को पा लेना चाहिए क्योंकि यह कॉन्ग्रेसिंग को नहीं पढ़ रहा है
ग्रेग

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

5
Log4net config फाइल को "यदि नया है तो कॉपी करें" के रूप में चिह्नित करना महत्वपूर्ण है। यदि कॉन्फ़िगरेशन फ़ाइल बिन फ़ोल्डर में कॉपी नहीं की गई है तो यह काम नहीं करने वाली है।
फ्रांसिस्को गोल्डनस्टीन

यह मेरे लिए काम करता है-जैसा है, और मैं इसे स्वीकृत समाधान के लिए पसंद करता हूं क्योंकि मेरी कुछ लाइब्रेरी का उपयोग एक वेब ऐप में किया जाता है जहां लॉगिंग को एक अलग log4net.config में कॉन्फ़िगर किया जाता है और कभी-कभी स्टैंड-अप ऐप में उपयोग किया जाता है जहां लॉगिंग होती है app.exe.config में कॉन्फ़िगर किया गया। इस तरह से यह सब विधानसभा की जानकारी के बजाय कॉन्फ़िगर में है - मैं log4net.config के लिए "हार्ड-कोड" नहीं करना चाहता हूं
डैनी

27

जो चरण छूट गया है, वह है

log4net.Config.XmlConfigurator.Configure(); 

यह configSource उपयोग करने का कारण होगा। GetLogger () कॉल करने से पहले एक बार सुनिश्चित कर लें;


यदि आपको मिच व्हीट के घोल का उपयोग करना है तो आपको ऐसा करने की आवश्यकता नहीं है।
राबर्ट वैगनर

4
@Robert: निश्चित रूप से, हालांकि मिच व्हीट के समाधान के लिए ऐप के बाहर कॉन्फिग फाइल को हार्ड कोडिंग की आवश्यकता होती है। - मैंने पढ़ा कि मूल सवाल यह है कि कॉन्फ्रेंस सोर्स काम क्यों नहीं करता है, यह काम करता है यदि इस अतिरिक्त कदम का पालन किया जाता है।
ग्रेग डोमजान

मुझे यह दृष्टिकोण अधिक पसंद है, खासकर क्योंकि मैं एक रैपर लॉग हैंडलर बनाता हूं जो आंतरिक रूप से लॉग 4net (जिसे बाद में बदला जा सकता है) का उपयोग करता है, फिर इस रैपर लॉग हैंडलर में मैं कॉल करता हूं log4net.Config.XmlChfururator.Configure ()। इस तरह, अपने स्वयं के app.config के साथ किसी भी परियोजना इस आवरण लॉग हैंडलर इस्तेमाल कर सकते हैं, परिवर्तन assembler.cs बिना
झेंग यू

19

सुनिश्चित करें कि आपकी log4net.config फ़ाइल निम्न गुणों के साथ सेट की गई है:

निर्माण कार्य: सामग्री

आउटपुट निर्देशिका की प्रतिलिपि बनाएँ: हमेशा कॉपी करें


10

या तो उपयोग करें,

<configuration>
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
</configSections>
<appSettings>
<add key="log4net.Config" value="Log4Net.config" />
</appSettings>

या केवल,

log4net.Config.XmlConfigurator.ConfigureAndWatch(new System.IO.FileInfo("Log4Net.config"));

दोनों ही मामलों में, फ़ाइल, Log4Net.config, आउटपुट डायरेक्टरी में होनी चाहिए। आप समाधान एक्सप्लोरर में Log4Net.config फ़ाइल गुणों को सेट करके ऐसा कर सकते हैं। बिल्ड एक्शन - कंटेंट और कॉपी टू आउटपुट डायरेक्टरी - कॉपी हमेशा


आपको पहले मामले के लिए <configSections> टैग की आवश्यकता नहीं है
डिस्कलॉगर

2

इस मुद्दे के लिए बाहर देखो ...

मेरे मामले में सब कुछ सही ढंग से कॉन्फ़िगर किया गया था। समस्या यह है कि मैंने साइट को WinHost.com पर अपलोड करने के लिए विज़ुअल स्टूडियो 2013 के अंदर वेब डिप्लॉय का उपयोग किया और यह सर्वर पर ACLs को रीसेट करता है। यह बदले में फ़ोल्डर्स और फ़ाइलों पर सभी अनुमति को रद्द कर देता है - लॉग 4नेट फ़ाइल नहीं लिख सकता है।

आप इसके बारे में यहां और अधिक पढ़ सकते हैं:

वेब अनुमतियों / MSBuild को सर्वर अनुमतियों को गड़बड़ाने से कैसे रोकें

मैंने ACLs को रीसेट करने के लिए वहां सपोर्ट टीम से पूछा और फिर log4net ने लॉग्स को थूकना शुरू किया। :)


1

मान लें कि आपके पास log4net.config नामक एक बाहरी कॉन्फिग फाइल है जिसे आपकी तैनाती निर्देशिका में कॉपी किया जाता है जिसे आप इसे इस तरह कॉन्फ़िगर कर सकते हैं:

using System;
using System.Collections.Generic;
using System.Windows.Forms;
using System.Reflection;

using log4net;

namespace MyAppNamespace {
    static class Program {
        //declare it as static and public so all classes in the project can access it
        //like so: Program.log.Error("got an error");
        public static readonly log4net.ILog log = log4net.LogManager.GetLogger(typeof(Program));

        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main() {
             //configure it to use external file
            log4net.Config.XmlConfigurator.Configure(new Uri(Application.StartupPath + "\\log4net.config"));
            //use it
            log.Debug("#############   STARING APPLICATION    #################");


            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new FormMain());
        }
    }
}

1

मेरे पास होने के अलावा भी यही समस्या थी

[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net")]

रनिंग प्रोजेक्ट में, रेफरेंस प्रोजेक्ट में मेरी निम्न पंक्ति भी है:

[assembly: log4net.Config.XmlConfigurator]

जब मैंने संदर्भित परियोजनाओं में इस लाइन को हटा दिया, तो लॉग दिखाई देने लगते हैं।


1

इसके लिए डीबग मोड चालू करना भी संभव है log4net। इसे App.config फ़ाइल में डालें:

 <appSettings>
      <add key="log4net.Internal.Debug" value="true"/>
 </appSettings>
 <system.diagnostics>
      <trace autoflush="true">
      <listeners>
           <add
             name="textWriterTraceListener"
             type="System.Diagnostics.TextWriterTraceListener"
             initializeData="link\to\your\file.log" />
      </listeners>
      </trace>
 </system.diagnostics>

और आपको कम से कम त्रुटि संदेश मिलेंगे, जिससे आप यह जान सकते हैं कि क्या गलत हुआ। मेरे मामले में मैं बस सेट Copy to output directoryकरना भूल गया Copy Always


0

@ मिच, यह पता चला है कि [विधानसभा: ...] घोषणा के साथ एक फ़ाइल है, लेकिन इसके पास कॉन्फ़िगाइल संपत्ति नहीं थी।

एक बार जब मैंने इसे जोड़ा और Log.config की ओर इशारा किया, तो इसने काम करना शुरू कर दिया। मैंने सोचा होगा कि यह अन्य सभी कॉन्फिगरेशन सेक्शन (यानी AppSettings) की तरह काम करेगा और बिना किसी मॉडिफिकेशन के एक्सटर्नल कॉन्फिगर फाइल को स्वीकार करेगा।

जैसा कि हमने एक वैश्विक स्थैतिक लॉग प्रदाता में लपेटा है, हमारे पास दूसरा उल्लेख नहीं है।


0

मेरे मामले में मुझे यह त्रुटि संदेश मिला:

log4net: config file [C:\........\bin\Debug\log4net.config] not found.

और log4net.configफ़ाइल विज़ुअल स्टूडियो 2017 परियोजना में थी, लेकिन जब मैंने bin\Debugफ़ोल्डर में फ़ाइल की जांच की तो मुझे नहीं मिला।

मेरा मूल असेंबली सेटअप इस तरह था:

[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", Watch = true)]

कुछ शोध समय के बाद, मैं इसे निम्नलिखित में बदल देता हूं और यह काम करता है:

[assembly: log4net.Config.XmlConfigurator(ConfigFile = @"..\..\log4net.config", Watch = true)]

0
  1. असेंबली में जोड़ें

[असेंबली: log4net.Config.XmlConfigurator (ConfigFile = "Log4Net.config")]

  1. सुनिश्चित करें कि log4net.config प्रोजेक्ट में शामिल है
  2. Log4net.config के गुणों में

यदि नया हो तो कॉपी करने के लिए आउटपुट ड्यूरेट्री में कॉपी बदलें

  1. डबल जाँच लॉग स्तर स्तर मान = "सभी"

0

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

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