سؤال

هل هناك قائمة بالمعلومات السياقية (IE $ {longdate}، $ {level}، $ {message}) عبر الإنترنت؟ أريد تعيين ملف السجل في مجلد The User AppData Local. هل هو ربما $ {appdatalocal}؟ وكيف يمكنني الوصول إلى الملف لإرسال كمرفق بريد إلكتروني
message.Attachments.Add("${appdatalocal}\somefolder\Application.log")?

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

المحلول

انظر الى هذا حلقة الوصل للحصول على قائمة من LayouDenderers التي يدعمها NLOG. لاحظ أن بعض هذه المصادقات تخطيط قد تمت إضافتها في NLOG 2.0 (والتي تم إصدارها للتو ك BETA في سبتمبر). هناك بعض Layouooderderers التي تتيح لك تحديد مجلدات "خاصة" (مثل المستندات، والموسيقى، إلخ). يوجد أيضا Layouooderner يمكن أن يسترجع قيمة THA لمتغير بيئة. يمكنك استخدام LayouDenderers لتحديد اسم الملف:

${basedir}/${shortdate}.log

أو

${environment:variable=TEMP}/${processname}.log

فيما يتعلق بالوصول إلى اسم الملف الناتج برمجيا، لست متأكدا من كيفية القيام بذلك، على الرغم من أن لدي فكرة ...

يمكنك تكوين methodcalltarget (انظر الوثائق على الرابط أعلاه - أو، وحتى أفضل، راجع ملف المساعدة NLOG) بنفس التصميم مثل التخطيط الذي تستخدمه لتحديد اسم الملف. حدد قاعدة مسجل واحدة في ملف nlog.config (أو app.config إذا قمت بتكوين مضطرب) يقوم بتسجيل الدخول إلى هذا الهدف. اكتب الطريقة الثابتة، LogMethod، سيتم استدعاؤه بواسطة MethodCallTarget. اكتب طريقة ثابتة أخرى، GetFilename، في نفس الفئة التي ترجع سلسلة. سجل GetFilename ببساطة رسالة باستخدام المسجل الذي تم تكوينه للكتابة إلى MethodCallTarget. nlog يدعو logmethod. داخل Logmethod سوف تتلقى الرسالة المنسقة بالكامل. نظرا لأنك قمت بتكوين التخطيط ليكون هو نفسه تخطيط اسم الملف (أي فقط المعلمات اللازمة لحساب اسم الملف)، يجب أن تكون قيمة الرسالة التي يتم تسجيل دخول المسار إلى الملف. نظرا لأن LogMethod يجب أن يكون طريقة ثابتة (متطلبات NLOG)، فلن يكون لديك الكثير من الخيارات حيث يتم تخزين "اسم الملف". أنا فقط وضعت في متغير سلسلة ثابتة.

شيء من هذا القبيل (بناء على عينات في ملف تعليمات NLOG ضمن MethoneCallTarget):

public class Example
{
  private static filename;

  //
  // This is the method that NLog will call when you log with the logger that is configured
  // to write to the MethodCallTarget
  //
  public static void LogMethod(string level, string message)
  {
    filename = message;
  }

  public static string GetLogFile()
  {
    Logger logger = LogManager.GetLogger("filenamelogger");
    filenamelogger.Info("logging a message just to get the result");
    return filename;
  }
}

تكوين شيء مثل هذا:

  <variable fn="${basedir}/${processname}.log" />
  <targets> 
    <target name="m" xsi:type="MethodCall" className="Example, MethodCall" 
            methodName="LogMethod"> 
      <parameter layout=${fn} /> 
    </target> 
    <target name="f" xsi:type="File"
            layout="${longdate} ${loggername} ${level} ${message}" 
            fileName="${fn}">
    </target>
  </targets> 
  <rules> 
    <logger name="filenamelogger" minlevel="Debug" writeTo="m" final="true" /> 
    <logger name="*" minlevel="Debug" writeTo="f" />
  </rules> 

من الواضح أن هذا ليس مؤمنا آمنا، لكنه يظهر طريقة للحصول على نتيجة تخطيط.

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