বাহ্যিক ফাইলে লগ 4 নেট কনফিগারেশন কাজ করে না


91

আমরা লগ 4 নেট ব্যবহার করছি এবং এটির কনফিগারেশনটি একটি বাহ্যিক কনফিগারেশন ফাইলে নির্দিষ্ট করতে চাই (যেমন আমরা অন্যান্য বিভাগগুলির সাথে করেছি)। এটি করতে আমরা App.config এর লগ 4 নেট বিভাগটি এতে পরিবর্তন করেছি:

...
<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- এ স্থানান্তরিত করি (উপরে প্রথম কোড লাইনটি প্রতিস্থাপন করে), এটি প্রত্যাশার মতো কাজ করে। কোনও ধারণা কেন এটি বাহ্যিক ফাইলে কাজ করছে না?


আমি একই সমস্যার মধ্যে দৌড়েছি - আমরা সম্ভবত একই (ভুল-নির্দেশিত) গাইড অনুসরণ করেছি!
জ্যাচ বার্লিংমে

14
লগ 4 নেট সম্পর্কে এটি আমার পছন্দ নয়। লগিং ফ্রেমওয়ার্কটি আমার মতে আপনার অ্যাপ্লিকেশনগুলির সবচেয়ে শক্ত বিটগুলির মধ্যে একটি হওয়া উচিত - তবে লগ 4 নেট প্রায়শই কিছুটা ফ্লেকি বলে মনে হয়।
আপট্রিউক

উত্তর:


113

আপনার AssemblyInfo.csফাইলে কি নিম্নলিখিত বৈশিষ্ট্য রয়েছে :

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

এবং প্রতিটি ক্লাসের শুরুতে এই জাতীয় কোডের জন্য লগিং কার্যকারিতা প্রয়োজন:

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

আমার এখানে একটি ব্লগ পোস্ট এবং অন্যান্য তথ্য রয়েছে


17
এটি কাজ করে, আপনি "আউটপুট ডিরেক্টরিতে অনুলিপি করুন" বৈশিষ্ট্যটি "সর্বদা অনুলিপি করুন" এ সেট করার জন্য লগ 4 নেট.কমফিগ ফাইল তৈরি করেন কিনা তা নিশ্চিত করুন।
ই ভ্যান ডার স্পয়েল

@ মাইটিওহিয়েট একেবারে likeশ্বরের মতো, আমি সারাদিন যা করে তা করার জন্য নিনজেক্ট ভিত্তিক সমাধানের সাথে লড়াই করছি ... ধন্যবাদ মানুষ!
যুদ্ধ

39

এই ইস্যুতে একটি উন্মুক্ত ত্রুটি আছে । লগ 4 নেট কনফিগারেশন উপাদানগুলির কনফিগার উত্সটি সমর্থন করে না। খাঁটি কনফিগারেশন ফাইল সমাধান ব্যবহার করতে আপনি অ্যাপসেটেটিংগুলিতে লগ 4 নেট.কনফিগ কী ব্যবহার করেন use

পদক্ষেপ 1: সাধারণ কনফিগারেশন বিভাগ সংজ্ঞা অন্তর্ভুক্ত করুন:

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

পদক্ষেপ 2: অ্যাপসেটেটিংগুলিতে ম্যাজিক লগ 4 নেট.কনফিগ কী ব্যবহার করুন।

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

পদক্ষেপ 3: কনফিগার উত্স পরিচালনা করতে প্যাচ অবদান রাখুন।


4
Log4net.Config.XMLConfigurator.Configure () এ একটি কল; কনফিগার সোর্স না পড়ার সাথে এই সমস্যাটি শেষ করা উচিত
গ্রেগ ডমজান

এটি আমার জন্য কিছুই পরিবর্তন করেনি। আমি এখনও বিষয়টি বের করতে পারি নি, তবে আমি অনুসরণ করার চেষ্টা করব।
ডন রোলিং

4
লগ 4 নেট কনফিগারেশন ফাইলটিকে "নতুন যদি অনুলিপি করুন" হিসাবে চিহ্নিত করা জরুরী। যদি কনফিগারেশন ফাইলটি বিন ফোল্ডারে অনুলিপি করা হয় না তবে এটি কাজ করবে না।
ফ্রান্সিসকো গোল্ডেনস্টাইন

এটি আমার পক্ষে যেমন রয়েছে তেমনই হয়েছে এবং আমি এটি গ্রহণযোগ্য সমাধানের পক্ষে পছন্দ করি কারণ আমার কিছু লাইব্রেরি একটি ওয়েব অ্যাপে ব্যবহার করা হয় যেখানে লগিংটি একটি পৃথক লগ 4 নেট.কমফিগে কনফিগার করা হয় এবং কখনও কখনও স্ট্যান্ড-বরাবর অ্যাপ্লিকেশনটিতে ব্যবহৃত হয় যেখানে লগিং হয় is app.exe.config এ কনফিগার করা হয়েছে। এই এটা পরিবর্তে কনফিগ সমস্ত সমাবেশ তথ্য আছে - আমি কে "হার্ড কোড" চাই না এটা log4net.config করতে
ড্যানি

27

যে পদক্ষেপটি মিস করা হয়েছে তা হ'ল

log4net.Config.XmlConfigurator.Configure(); 

এটি কনফিগার উত্স ব্যবহার করার কারণ ঘটায়। গেটলগার () কল করার আগে আপনি একবার কল করেছেন তা নিশ্চিত করুন;


আপনি যদি মিচ গমের সমাধান ব্যবহার করেন তবে আপনাকে এটি করার দরকার নেই need
রবার্ট ওয়াগনার

4
@ রবার্ট: অবশ্যই, যদিও মিচ হুইটসের সমাধানটির জন্য অ্যাপকনফাইগের বাইরে কনফিগার ফাইলটি হার্ড কোডিংয়ের প্রয়োজন - আমি মূল প্রশ্নটি পড়েছিলাম কেন কনফিগার্স কাজটি কাজ করে না, যদি এই অতিরিক্ত পদক্ষেপ অনুসরণ করা হয় তবে এটি কাজ করে।
গ্রেগ ডোমজান

আমি এই পদ্ধতিরটি বেশি পছন্দ করি, বিশেষত কারণ আমি একটি মোড়ক লগ হ্যান্ডলার তৈরি করি যা অভ্যন্তরীণভাবে লোগ 4 নেট ব্যবহার করে (যা পরে প্রতিস্থাপন করা যেতে পারে), তারপরে এই মোড়কের লগ হ্যান্ডলারে আমি লগ 4 নেট.কনফিগ.এক্সএমএল কনফিগুয়েটার.কনফিগার () কল করি। এইভাবে, নিজস্ব অ্যাপ্লিকেশন কোডফাইগের সাথে যে কোনও প্রকল্পই এসেম্বলআর.সি পরিবর্তন করার প্রয়োজন ছাড়াই এই মোড়কের লগ হ্যান্ডলারটি ব্যবহার করতে পারে
zheng yu

19

আপনার লগ 4 নেট.কমফিগ ফাইলটি নিম্নলিখিত বৈশিষ্ট্যগুলির সাথে সেট করা আছে তা নিশ্চিত করুন:

বিল্ড অ্যাকশন: সামগ্রী

আউটপুট ডিরেক্টরিতে অনুলিপি করুন: সর্বদা অনুলিপি করুন


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"));

উভয় ক্ষেত্রেই লগ 4 নেট.কমফিগ ফাইলটি আউটপুট ডিরেক্টরিতে থাকা উচিত। আপনি সমাধান এক্সপ্লোরারে লগ 4 নেট কোডফাইগ ফাইল বৈশিষ্ট্য সেট করে এটি করতে পারেন। বিল্ড অ্যাকশন - সামগ্রী এবং আউটপুট ডিরেক্টরিতে অনুলিপি - সর্বদা অনুলিপি করুন


প্রথম মামলার জন্য আপনার <কনফিগসেকশনস> ট্যাগের দরকার নেই
ডিস্ক্লোজার

2

এই সমস্যাটি দেখুন ...

আমার ক্ষেত্রে সবকিছু সঠিকভাবে কনফিগার করা হয়েছিল। সমস্যা হল আমি সাইটের আপলোড করতে ভিসুয়াল স্টুডিও 2013 ভিতরে ওয়েব স্থাপন ব্যবহার করে তা হল WinHost.com এবং এটি পুনরায় সেট ACLs সার্ভারে। ফলস্বরূপ এটি ফোল্ডার এবং ফাইলগুলিতে সমস্ত অনুমতি বাতিল করে - লগ 4 নেট ফাইলটি লিখতে পারেনি।

আপনি এখানে এটি সম্পর্কে আরও পড়তে পারেন:

কীভাবে ওয়েব মোতায়েন / এমএসবিল্ডকে সার্ভারের অনুমতিগুলি জগাখিচুড়ি থেকে বন্ধ করবেন

আমি সেখানে সমর্থন টিমকে এসিএলগুলি পুনরায় সেট করতে বলেছিলাম এবং তারপরে লগ 4 নেট লগগুলি স্পিট করা শুরু করে। :)


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 ফাইলে sertোকান:

 <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>

এবং আপনি কমপক্ষে ত্রুটি বার্তা পাবেন, যা থেকে আপনি ঠিক কী ভুল হয়েছে তা পেতে পারেন der আমার ক্ষেত্রে আমি কেবল সেট Copy to output directoryকরতে ভুলে গেছি Copy Always


0

@ মিচ, এটি দেখা যাচ্ছে যে [সমাবেশ: ...] ঘোষণার সাথে একটি ফাইল রয়েছে তবে এতে কনফিগার ফাইলের সম্পত্তি নেই।

একবার আমি এটি যুক্ত করে লগকনফিগের দিকে ইঙ্গিত করেছিলাম, এটি কাজ শুরু করে। আমি ভাবতাম যে এটি অন্যান্য সমস্ত কনফিগার বিভাগগুলির (যেমন অ্যাপসেটেটিং) এর মতো কাজ করবে এবং বাহ্যিক কনফিগারেশন ফাইলগুলি কোনও পরিবর্তন ছাড়াই গ্রহণ করবে।

আপনার উল্লেখ করা দ্বিতীয় বিবৃতিটি আমাদের কাছে নেই, কারণ আমরা এটিকে বিশ্বব্যাপী স্ট্যাটিক লগ সরবরাহকারীতে মোড়ানো করি।


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 (কনফিগারফিল = "লগ 4 নেট.কমফিগ")]

  1. নিশ্চিত করুন যে log4net.config প্রকল্পের অন্তর্ভুক্ত রয়েছে
  2. Log4net.config এর বৈশিষ্ট্যগুলিতে

পরিবর্তন আউটপুট Dirctory অনুলিপি করা কপি নতুন কোনো

  1. ডাবল চেক লগ স্তরের স্তরের মান = "সমস্ত"

0

এটি উল্লেখ করার মতোও যে কোনও ওয়েব অ্যাপ্লিকেশনটিতে এটি বিন ফোল্ডারটি নয়, মূল ডিরেক্টরিতে দেখায়, তাই আপনি কনফিগার ফাইলটি কোথায় রেখেছেন তা নিশ্চিত করুন।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.