سؤال

نحن نستخدم log4net و تريد تحديد هذا التكوين في ملف التكوين الخارجي (كما فعلنا مع الأقسام الأخرى).للقيام بذلك علينا تغيير log4net القسم في التطبيق.config:

...
<section name="log4net" 
     type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
...
<log4net configSource="Log.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>

ومع ذلك ، عندما نقوم بتشغيل التطبيق لا يتم إنشاء ملف سجل (و لا تسجيل ذلك).لا توجد رسائل خطأ الإخراج إلى وحدة التحكم.

إذا كنا نقل محتويات السجل.config مرة أخرى في التطبيق.التكوين (استبدال أول سطر التعليمات البرمجية أعلاه) ، يعمل كما هو متوقع.أي فكرة لماذا لا يعمل في ملف خارجي?

هل كانت مفيدة؟

المحلول

هل لديك السمة التالية في ملف AssemblyInfo.cs الخاص بك:

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

ورمز مثل هذا في بداية كل فئة تتطلب وظيفة تسجيل:

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

ولدي وظيفة بلوق التي تحتوي على هذه المعلومات وغيرها من هنا .

نصائح أخرى

وهناك مثل مفتوحة عيب على هذه المسألة. Log4Net لا يدعم السمة configSource من عناصر التكوين. لاستخدام حل ملف التكوين بحتة استخدام المفتاح log4net.Config في appSettings.

الخطوة 1: تضمين قسم التكوين تعريف العادي:

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

الخطوة 2: استخدام المفتاح السحري log4net.Config في appSettings.

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

والخطوة 3: المساهمة تصحيحا لإصلاح التعامل مع configSource.

والخطوة التي تم تفويتها هو

log4net.Config.XmlConfigurator.Configure(); 

وهذا سوف يتسبب في configSource لاستخدامها. تأكد من أن يطلق عليه مرة واحدة قبل استدعاء GetLogger ()؛

تأكد من أن يتم تعيين ملف log4net.config مع الخصائص التالية:

والعمل البناء: المحتوى

ونسخ إلى الدليل الإخراج: نسخ دائما

وإما استخدام،

<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 في حل اكسبلورر. بناء العمل - المحتوى ونسخ إلى دليل إخراج - نسخة دائما

واحترس من هذه القضية ...

في حالتي كل شيء تم تكوينها بشكل صحيح. والمشكلة هي أن اعتدت نشر ويب داخل البصرية ستوديو 2013 لتحميل الموقع ل WinHost.com وإعادة تعيين في قوائم ACL على الخادم. وهذا بدوره إلغاء كل إذن على الملفات والمجلدات - log4net لا يمكن أن يكتب الملف

ويمكنك قراءة المزيد حول هذا الموضوع هنا:

كيف لوقف الويب نشر / MSBuild من العبث أذونات ملقم

وسألت فريق الدعم هناك لإعادة تعيين قوائم ACL ثم log4net التي البصق السجلات. :)

وعلى افتراض كان لديك دعا 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());
        }
    }
}

وكان لي نفس المشكلة، إلى جانب وجود

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

وفي المشروع التوالي، كما أتيحت لي السطر التالي في مشروع المرجعية:

[assembly: log4net.Config.XmlConfigurator]

عند أزلت هذا الخط في المشاريع المشار إليه، سجلات تبدأ في الظهور.

ومن الممكن أيضا لتشغيل وضع التصحيح ل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.

وMitch، وتبين وجود ملف مع [التجمع: ...] الإعلان، ولكن لم يكن لديها ممتلكات ConfigFile.

وعندما أضفت عليه، وأشار إلى Log.config، وبدأت العمل. كنت قد فكرت انها ستعمل مثل كل الأقسام التكوين الأخرى (أي AppSettings) وقبول ملفات التكوين الخارجية مع أي تعديل.

ونحن لم يكن لديك البيان الثاني الذي ذكرته، ونحن التفاف عليه في موفر سجل ثابت العالمي.

في حالتي أنا حصلت على رسالة الخطأ هذه:

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

و log4net.config الملف في Visual Studio عام 2017 المشروع ، ولكن عندما راجعت الملف في bin\Debug المجلد أنا لا يمكن العثور عليه.

بلدي الأصلي الجمعية الإعداد كان مثل هذا:

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

بعد بعض الوقت للبحث ، وأنا تغييره التالية و يعمل:

[assembly: log4net.Config.XmlConfigurator(ConfigFile = @"..\..\log4net.config", Watch = true)]
  1. إضافة التالية إلى AssemblyInfo.cs

[الجمعية:log4net.Config.XmlConfigurator(ConfigFile = "Log4Net.التكوين")]

  1. تأكد من log4net.التكوين يتم تضمينها في المشروع
  2. في خصائص log4net.التكوين

تغيير نسخة الانتاج Dirctory إلى نسخ إذا أحدث

  1. الاختيار مزدوج سجل مستوى مستوى value="ALL"
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top