এর মধ্যে কয়েকটি কঠোরভাবে কনফিগারেশন পরামর্শের পরিবর্তে সাধারণ এনএলজি (বা লগিং) টিপসের বিভাগে আসে।
এখানে এখান থেকে কিছু সাধারণ লগিং লিঙ্কগুলি এসও তে রয়েছে (আপনি ইতিমধ্যে এর কিছু বা সমস্ত কিছু আগেই দেখে থাকতে পারেন):
লগ 4 নেট বনাম এনলগ
লগিং সেরা অভ্যাস
একটি লগিং সম্মুখের পয়েন্ট কি?
লগাররা প্রতি ক্লাসে লগার ব্যবহারের পরামর্শ দেয় কেন?
শ্রেণীর উপর ভিত্তি করে আপনার লগার নামকরণের সাধারণ প্যাটার্নটি ব্যবহার করুন Logger logger = LogManager.GetCurrentClassLogger()
। এটি আপনাকে আপনার লগারে একটি উচ্চতর ডিগ্রি গ্র্যানুলারিটি দেয় এবং লগারের কনফিগারেশনে আপনাকে দুর্দান্ত স্বাচ্ছন্দ্য দেয় (বিশ্বব্যাপী নিয়ন্ত্রণ করুন, নামফলক দ্বারা, নির্দিষ্ট লগারের নামে ইত্যাদি)।
যেখানে উপযুক্ত সেখানে শ্রেণিবদ্ধ-ভিত্তিক লগার ব্যবহার করুন। হতে পারে আপনার একটি ফাংশন রয়েছে যার জন্য আপনি লগিংকে আলাদাভাবে নিয়ন্ত্রণ করতে চান। হতে পারে আপনার কিছু ক্রস কাটিয়া লগিং উদ্বেগ রয়েছে (পারফরম্যান্স লগিং)।
আপনি যদি ক্লাসের নাম ভিত্তিক লগিং ব্যবহার না করেন তবে আপনার লগারের নামকরণকে কোনও ধরণের শ্রেণিবদ্ধ কাঠামোর (সম্ভবত কার্যকরী অঞ্চল দ্বারা) নামকরণ বিবেচনা করুন যাতে আপনি আপনার কনফিগারেশনে আরও বেশি নমনীয়তা বজায় রাখতে পারেন। উদাহরণস্বরূপ, আপনার কাছে একটি "ডাটাবেস" কার্যকরী অঞ্চল, একটি "বিশ্লেষণ" এফএ এবং একটি "ইউআইআই" এফএ থাকতে পারে। এর প্রত্যেকটির উপ-অঞ্চল থাকতে পারে। সুতরাং, আপনি এই জাতীয় লগরের অনুরোধ করতে পারেন:
Logger logger = LogManager.GetLogger("Database.Connect");
Logger logger = LogManager.GetLogger("Database.Query");
Logger logger = LogManager.GetLogger("Database.SQL");
Logger logger = LogManager.GetLogger("Analysis.Financial");
Logger logger = LogManager.GetLogger("Analysis.Personnel");
Logger logger = LogManager.GetLogger("Analysis.Inventory");
ইত্যাদি। শ্রেণিবদ্ধ লগারের সাহায্যে আপনি বিশ্বব্যাপী লগিং ("*" বা মূল লগার), এফএ (ডেটাবেস, বিশ্লেষণ, ইউআই) দ্বারা বা সুবারিয়া (ডাটাবেস.কনেক্ট, ইত্যাদি) দ্বারা কনফিগার করতে পারেন।
লগারদের অনেকগুলি কনফিগারেশন বিকল্প রয়েছে:
<logger name="Name.Space.Class1" minlevel="Debug" writeTo="f1" />
<logger name="Name.Space.Class1" levels="Debug,Error" writeTo="f1" />
<logger name="Name.Space.*" writeTo="f3,f4" />
<logger name="Name.Space.*" minlevel="Debug" maxlevel="Error" final="true" />
প্রতিটি বিকল্পের অর্থ কী তা বোঝার জন্য আরও তথ্যের জন্য NLog সহায়তা দেখুন । সম্ভবত এখানে সর্বাধিক উল্লেখযোগ্য আইটেমগুলি ওয়াইল্ডকার্ড লগার নিয়ম করার ক্ষমতা, এমন এক ধারণা যে একাধিক লগার নিয়ম একক লগিং বিবৃতিটির জন্য "চালিত" করতে পারে এবং লগার নিয়মটিকে "চূড়ান্ত" হিসাবে চিহ্নিত করা যায় ফলে পরবর্তী নিয়মগুলি কোনওটির জন্য কার্যকর হবে না প্রদত্ত লগিং বিবৃতি।
আপনার আউটপুটে অতিরিক্ত প্রসঙ্গ যুক্ত করতে গ্লোবাল ডায়াগনস্টিক কনটেক্সট, ম্যাপডডায়াগনস্টিক কনটেক্সট এবং নেস্টেডডায়াগনস্টিক কনটেক্সট ব্যবহার করুন।
সরল করার জন্য আপনার কনফিগারেশন ফাইলে "ভেরিয়েবল" ব্যবহার করুন। উদাহরণস্বরূপ, আপনি আপনার বিন্যাসের জন্য ভেরিয়েবলগুলি সংজ্ঞায়িত করতে পারেন এবং তারপরে সরাসরি বিন্যাসটি নির্দিষ্ট করার পরিবর্তে লক্ষ্য কনফিগারেশনে ভেরিয়েবলটি উল্লেখ করতে পারেন।
<variable name="brief" value="${longdate} | ${level} | ${logger} | ${message}"/>
<variable name="verbose" value="${longdate} | ${machinename} | ${processid} | ${processname} | ${level} | ${logger} | ${message}"/>
<targets>
<target name="file" xsi:type="File" layout="${verbose}" fileName="${basedir}/${shortdate}.log" />
<target name="console" xsi:type="ColoredConsole" layout="${brief}" />
</targets>
অথবা, আপনি একটি বিন্যাসে যুক্ত করতে বৈশিষ্ট্যের একটি "কাস্টম" সেট তৈরি করতে পারেন।
<variable name="mycontext" value="${gdc:item=appname} , ${mdc:item=threadprop}"/>
<variable name="fmt1withcontext" value="${longdate} | ${level} | ${logger} | [${mycontext}] |${message}"/>
<variable name="fmt2withcontext" value="${shortdate} | ${level} | ${logger} | [${mycontext}] |${message}"/>
বা, আপনি কনফিগারেশনের মাধ্যমে কঠোরভাবে "দিন" বা "মাস" লেআউট রেন্ডারার তৈরি করার মতো জিনিসগুলি করতে পারেন:
<variable name="day" value="${date:format=dddd}"/>
<variable name="month" value="${date:format=MMMM}"/>
<variable name="fmt" value="${longdate} | ${level} | ${logger} | ${day} | ${month} | ${message}"/>
<targets>
<target name="console" xsi:type="ColoredConsole" layout="${fmt}" />
</targets>
আপনি নিজের ফাইলের নাম সংজ্ঞায়িত করতে লেআউট রেন্ডারগুলিও ব্যবহার করতে পারেন:
<variable name="day" value="${date:format=dddd}"/>
<targets>
<target name="file" xsi:type="File" layout="${verbose}" fileName="${basedir}/${day}.log" />
</targets>
আপনি যদি প্রতিদিন আপনার ফাইলটি রোল করেন তবে প্রতিটি ফাইলের নাম রাখা যেতে পারে "সোমবার.লগ", "মঙ্গলবার.লগ", ইত্যাদি etc.
আপনার নিজের লেআউট রেন্ডারার লিখতে ভয় পাবেন না। এটি সহজ এবং কনফিগারেশনের মাধ্যমে লগ ফাইলে আপনার নিজস্ব প্রসঙ্গ তথ্য যুক্ত করতে দেয়। উদাহরণস্বরূপ, এখানে একটি লেআউট রেন্ডারার রয়েছে (NLog 1.x ভিত্তিক, 2.0 নয়) যা ট্রেস যোগ করতে পারে or
[LayoutRenderer("ActivityId")]
class ActivityIdLayoutRenderer : LayoutRenderer
{
int estimatedSize = Guid.Empty.ToString().Length;
protected override void Append(StringBuilder builder, LogEventInfo logEvent)
{
builder.Append(Trace.CorrelationManager.ActivityId);
}
protected override int GetEstimatedBufferSize(LogEventInfo logEvent)
{
return estimatedSize;
}
}
আপনার এনএলজি এক্সটেনশানগুলি (কী সমাবেশ) এটি পছন্দ করে তা এনএলগকে বলুন:
<extensions>
<add assembly="MyNLogExtensions"/>
</extensions>
কাস্টম লেআউট রেন্ডারারটি এর মতো ব্যবহার করুন:
<variable name="fmt" value="${longdate} | ${ActivityId} | ${message}"/>
অ্যাসিঙ্ক লক্ষ্যগুলি ব্যবহার করুন:
<nlog>
<targets async="true">
<!-- all targets in this section will automatically be asynchronous -->
</targets>
</nlog>
এবং ডিফল্ট লক্ষ্য মোড়ক:
<nlog>
<targets>
<default-wrapper xsi:type="BufferingWrapper" bufferSize="100"/>
<target name="f1" xsi:type="File" fileName="f1.txt"/>
<target name="f2" xsi:type="File" fileName="f2.txt"/>
</targets>
<targets>
<default-wrapper xsi:type="AsyncWrapper">
<wrapper xsi:type="RetryingWrapper"/>
</default-wrapper>
<target name="n1" xsi:type="Network" address="tcp://localhost:4001"/>
<target name="n2" xsi:type="Network" address="tcp://localhost:4002"/>
<target name="n3" xsi:type="Network" address="tcp://localhost:4003"/>
</targets>
</nlog>
যেখানে যথাযথ. সেগুলি সম্পর্কে আরও তথ্যের জন্য এনএলজি ডক্স দেখুন।
কনফিগারেশনটি পরিবর্তন হলে এটি দেখতে NLog কে দেখুন এবং স্বয়ংক্রিয়ভাবে পুনরায় লোড করুন:
<nlog autoReload="true" />
এনএলগ সমস্যা সমাধানের জন্য সহায়তা করার জন্য বেশ কয়েকটি কনফিগারেশন বিকল্প রয়েছে
<nlog throwExceptions="true" />
<nlog internalLogFile="file.txt" />
<nlog internalLogLevel="Trace|Debug|Info|Warn|Error|Fatal" />
<nlog internalLogToConsole="false|true" />
<nlog internalLogToConsoleError="false|true" />
আরও তথ্যের জন্য NLog সহায়তা দেখুন।
এনএলজি ২.০ লেআউটআরেন্ডারারের মোড়কে যুক্ত করে যা একটি লেআউট রেন্ডারারের আউটপুট (যেমন ট্রিমিং হোয়াইটস্পেস, বড় হাতের বাচ্চা, লোয়ারকেসিং ইত্যাদি) অতিরিক্ত প্রসেসিংয়ের অনুমতি দেয়।
আপনি যদি লগের উপর নির্ভরশীলতার উপর নির্ভর করে আপনার কোডকে উত্তাপ করতে চান তবে লগারটি মোড়ানোতে ভয় পাবেন না, তবে সঠিকভাবে মোড়ানো। এনএলগের গিথুব সংগ্রহস্থলে কীভাবে মোড়ানো যায় তার উদাহরণ রয়েছে। মোড়ানোর আরেকটি কারণ হতে পারে যে আপনি প্রতিটি লগ করা বার্তায় স্বয়ংক্রিয়ভাবে নির্দিষ্ট প্রসঙ্গের তথ্য যুক্ত করতে চান (এটি LogEventInfo.Context এ রেখে)।
এনএলজি (বা বিষয়টির জন্য অন্য কোনও লগিং ফ্রেমওয়ার্ক) মোড়ানোর পক্ষে (বা বিমূর্ত করা) পক্ষে মতামত রয়েছে। একটু চেষ্টা করে আপনি উভয় পক্ষ উপস্থাপন করে এখানে প্রচুর তথ্য পেতে পারেন।
যদি আপনি মোড়ানো বিবেচনা করে থাকেন, সাধারণ.লগিং ব্যবহার করার বিষয়টি বিবেচনা করুন । এটি বেশ ভালভাবে কাজ করে এবং যদি আপনি এটি করতে ইচ্ছুক হন তবে সহজেই আপনাকে অন্য লগিং ফ্রেমওয়ার্কে স্যুইচ করতে দেয়। এছাড়াও যদি আপনি মোড়ানো বিবেচনা করছেন, আপনি কীভাবে প্রসঙ্গের বিষয়গুলি পরিচালনা করবেন (জিডিসি, এমডিসি, এনডিসি) তা চিন্তা করুন। কমন.লগিং বর্তমানে তাদের বিমূর্ততা সমর্থন করে না, তবে এটি যুক্ত করার ক্ষমতাগুলির কাতারে রয়েছে বলে মনে করা হচ্ছে।