سؤال

كيف - إن أمكن - يمكنني استخدام NLOG كمسجل ملفات التمرير؟ كما لو:

أرغب في الحصول على 31 ملفًا على الأقل لمدة 31 يومًا ، وعندما يبدأ يوم جديد ، إذا كان هناك ملف سجل اليوم القديم ## لمدة 27 يومًا.

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

المحلول

أخيرًا استقرت مع أرشيف الملف القائم على الحجم. أستخدم خدعة لتسمية الملف بعد يوم من الشهر فقط وكنت بحاجة إلى أرشيف الملف القائم على الحجم لأنه يساعد حقًا عند بدء تسجيل الدخول إلى ما يتجاوز مائة ميغا. يساعد في صنع - على سبيل المثال - 20 ميغابايت من قطع السجل ، بحيث يمكن للمرء بسهولة إلقاء نظرة سريعة عليها مع أداة خفيفة الوزن مثل Notepad ++.

إنه يعمل لمدة عام تقريبًا الآن. هنا نسخة مبسطة من بلدي NLog.config ملف:

<?xml version="1.0" encoding="utf-8" ?>
<nlog autoReload="true" throwExceptions="true"
      xmlns="http://www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <variable name="LogDir" value="${specialfolder:folder=MyDocuments}/MyApp/Log"/>
  <variable name="LogDay" value="${date:format=dd}"/>
  <targets>
    <target name="LogTarget1" xsi:type="File" fileName="${LogDir}/${LogDay}.log" encoding="utf-8"
        maxArchiveFiles="10" archiveNumbering="Sequence" archiveAboveSize="1048576" archiveFileName="${LogDir}/{#######}.a" />
  </targets>
  <rules>
    <logger name="AppLog" writeTo="LogTarget1" />
  </rules>
</nlog>

يجعل هذا التكوين ملف سجل 1 ميغابايت لكل يوم من أيام الشهر والحفاظ على أكثر من 10 قطع سجل 1 ميغابايت في My Documents\MyApp\Log مجلد؛ مثل 29.log, 30.log و 31.log.

تعديل: لقد استخدم هذا لبعض الوقت NLog.config ملف ويغطي إلى حد كبير كل الحالات التي أحتاجها. لدي مستويات مختلفة من التسجيل من فئات مختلفة في ملفات منفصلة ، وعندما تصبح كبيرة ، سيتم أرشفةها على أساس الحجم ، بطريقة كل ساعة:

<?xml version="1.0" encoding="utf-8" ?>
<nlog autoReload="true" throwExceptions="true" internalLogFile="nlog-internals.log"
      xmlns="http://www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <variable name="LogHome" value="${basedir}/Log"/>
  <variable name="DailyDir" value="${LogHome}/${date:format=yyyy}/${date:format=MM}/${date:format=dd}"/>
  <variable name="HourlyArchive" value="${DailyDir}/${date:format=HH}-Archive/${level}-${logger}-{#######}-archived.a"/>
  <variable name="AppLogPath" value="${DailyDir}/${level}-${logger}.log"/>
  <variable name="DataLogPath" value="${DailyDir}/_data/inouts-${shortdate}.log"/>
  <variable name="EventSource" value="Application" />
  <targets>
    <target name="AppAsyncTarget" xsi:type="AsyncWrapper">
      <target xsi:type="RetryingWrapper" retryDelayMilliseconds="3000" retryCount="10">
        <target xsi:type="File" fileName="${AppLogPath}" encoding="utf-8"
            maxArchiveFiles="50" archiveNumbering="Sequence" archiveAboveSize="1048576" archiveFileName="${HourlyArchive}"
            layout="`${longdate}`${level}`${message}" />
      </target>
    </target>
    <target name="DataAsyncTarget" xsi:type="AsyncWrapper">
      <target xsi:type="RetryingWrapper" retryDelayMilliseconds="1500" retryCount="300">
        <target xsi:type="File" fileName="${DataLogPath}" encoding="utf-8"
            layout="`${longdate}`${message}" />
      </target>
    </target>
    <target name="EventLogAsyncTarget" xsi:type="AsyncWrapper">
      <target xsi:type="RetryingWrapper">
        <target xsi:type="EventLog" source="${EventSource}" machineName="." />
      </target>
    </target>
  </targets>
  <rules>
    <logger name="Data" writeTo="DataAsyncTarget" final="true" />
    <logger name="Event" writeTo="EventLogAsyncTarget" final="true" />
    <logger name="*" writeTo="AppAsyncTarget" />
  </rules>
</nlog>

وفي كل فصل أريد وظيفة تسجيل ، أضع هذا:

static readonly Logger SlotClassLogger = LogManager.GetCurrentClassLogger();
static Logger ClassLogger { get { return SlotClassLogger; } }

اثنين من المسجلين الإضافيين لتراكم بعض البيانات على أساس يومي والكتابة إلى سجل الأحداث Windows ؛ وهي سجلات تسجيلات على مستوى التطبيق:

public static Logger DataLog { get; private set; }
public static Logger AppEventLog { get; private set; }

ويجب تهيئتها في بدء التطبيق:

DataLog = LogManager.GetLogger("Data");
AppEventLog = LogManager.GetLogger("Event");

ملاحظة: في بعض الأحيان ، يمكنك الحصول على استثناء تم إنتاجه بواسطة NLOG. ذلك لأن شيئًا غير تهيئته ، لا يمكن التخلص منه! لقد كتبت فقط إدخالًا فارغًا في المسجل الخاص بك في App Start ، قل:

DataLog.Info(string.Empty);

لقد أضفت هذا الحد من الحجم بحيث يمكن عرض ملف السجل في (على سبيل المثال) المفكرة على خادم منخفض ، للمراجعات السريعة. يجب عليك تعديلها بناءً على احتياجاتك.

نصائح أخرى

أود أن أقترح عليك فصل المشكلة إلى جانبين مختلفين:

  • التدحرج إلى اسم ملف جديد كل يوم (ضع في اعتبارك المنطقة الزمنية ؛ يوم UTC ربما؟)
  • حذف ملفات السجل القديمة

في تجربتي ، سيكون من المفيد الاحتفاظ بالتاريخ في اسم ملف السجل ، على سبيل المثال

debug-2010-06-08.log

يجب أن يكون هذا الجزء سهلاً مع NLOG ، بالنظر إلى أمثلة في المستندات.

الآن يمكن بسهولة القيام الجزء الثاني في موضوع ثانٍ أو ربما حتى عملية مختلفة تمامًا - يحتاج فقط إلى معرفة عدد الملفات الموجودة وحذف أقدم هذه الملفات إذا لزم الأمر. يجب أن يكون العثور على "الأقدم" سهلاً إذا كان التاريخ في اسم الملف ، حتى لو كنت لا ترغب في الوثوق بمعلومات نظام الملفات.

في الواقع ، بالنظر إلى وثائق NLOG ، يبدو الأمر مثل "أرشيف الملف القائم على الوقت" قد يفعل Target ما تريده بالضبط ... ولكن حتى لو لم يكن كذلك ، يجب أن يكون نهج "ملف سجل واحد يوميًا" وترحيل التنظيف الخاص بك أمرًا سهلاً.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top