سؤال

وأريد log4net لكتابة ملفات السجل (باستخدام RollingFileAppender) إلى مجلد فرعي من المجلد بيانات التطبيقات الشائعة (مثل C: \ الوثائق وإعدادات \ جميع المستخدمين \ بيانات \ شركة التطبيق \ المنتج \ سجلات)
. ومع ذلك، على وين XP، ليس هناك متغير البيئة التي تحدد هذا المجلد. لدينا %ALLUSERSPROFILE%، لدينا %APPDATA%، ولكن ليس هناك شيء مثل %ALLUSERSAPPDATA%.
برمجيا، ويمكنني أن استخدام Environment.SpecialFolder.CommonApplicationData، ولكني في حاجة لوضعها في التكوين log4net، شيء من هذا القبيل:

<appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">
   <file value="%ALLUSERSAPPDATA%\Company\Product\Logs\error.log" />
</appender>

وOK، يمكننا تحديد هذا في الإعداد لدينا، ولكن ربما يأتي شخص ما مع فكرة أفضل؟

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

المحلول

هذا الإعلان على مايلينغليست log4net يشرح كيف يمكن أن تحدد بنفسك المتغيرات استبدال المسار.

نصائح أخرى

ونحن فقط استخدام هذا:

<param name="File" value="${ALLUSERSPROFILE}/Company/Product/Logs/error.log"/>

وإنه يعمل بشكل ممتاز.


يمكن ببساطة إدخال هذا الخط في التكوين appender الحالي:

<appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">
   <param name="File" value="${ALLUSERSPROFILE}/Company/Product/Logs/error.log"/>
</appender>

وهنا هو رمز الكامل من القائمة log4net البريدية التي <وأ href = "https://stackoverflow.com/questions/468989/how-to-specifiy-common-application-data-folder-for-log4net/469017# 469017 "> pilif ومرتبطة:

وأساسا فإن هذه الطريقة لتنفيذ تحويل نمط مخصص لملف log4net التكوين.

والأولى إضافة هذه الفئة إلى المشروع الخاص بك:

public class SpecialFolderPatternConverter : log4net.Util.PatternConverter
{
    override protected void Convert(System.IO.TextWriter writer, object state)
    {
        Environment.SpecialFolder specialFolder = (Environment.SpecialFolder)Enum.Parse(typeof(Environment.SpecialFolder), base.Option, true);
        writer.Write(Environment.GetFolderPath(specialFolder));
    }
}

وثم إعداد المعلمة الملف من FileAppender على النحو التالي:

<file type="log4net.Util.PatternString">
    <converter>
      <name value="folder" />
      <type value="MyAppName.SpecialFolderPatternConverter,MyAppName" />
    </converter>
    <conversionPattern value="%folder{CommonApplicationData}\\SomeOtherFolder\\log.txt" />
</file>

وأساسا %folder يقول ذلك للنظر في تحويل دعا folder الذي يشير إلى الطبقة SpecialFolderPatternConverter. ثم يدعو Convert على تلك الفئة، ويمر في CommonApplicationData (أو أيا كان) قيمة التعداد.

وعلى ما يبدو في الإصدار التالي من log4net (1.2.11) سوف يكون هناك طريقة أسهل، كما هو موضح <لأ href = "https://stackoverflow.com/questions/1535736/log4net-how-can-i-change -The ملف في الموقع برمجيا-ج / 1535998 # 1535998 "> هنا .

وكامل والعمل حل - محتوى ملف Log4net.config بلدي. في الإصدار الفعلي للLog4Net ليست هناك حاجة لكتابة تحويل نمط الخاصة بعد الآن

<?xml version="1.0"?>
<log4net>
  <root>
    <level value="INFO" />
    <appender-ref ref="LogFileAppender" />
  </root>
  <appender name="LogFileAppender" type="log4net.Appender.RollingFileAppender" >
    <file type="log4net.Util.PatternString" value="%envFolderPath{CommonApplicationData}\\MyProject\\Logs\\log.txt" />
    <rollingStyle value="Size" />
    <maxSizeRollBackups value="10" />
    <maximumFileSize value="100MB" />
    <layout type="log4net.Layout.PatternLayout">
      <ConversionPattern type="log4net.Util.PatternString" value="%%-5p %%d{yyyy-MM-dd HH:mm:ss} - %%m%%n" />
    </layout>
  </appender>
</log4net>

في النسخة log4net الحالي (2.0.8.0) هل يمكن ببساطة استخدام

و<file value="${ProgramData}\myFolder\LogFiles\" /> لC:\ProgramData

و${LocalAppData} لC:\Users\user\AppData\Local\

وو${AppData} لC:\Users\user\AppData\Roaming\

والآن (عام 2018 فبراير) كما في النسخة log4net 2.0.8.0.

ويمكنك استخدام دون أي تحويل للحصول على متغيرات البيئة على النحو التالي.

<file type="log4net.Util.PatternString" value="%envFolderPath{CommonApplicationData}\\mylogfile.txt" />

وراجع: log4net.Util.PatternString توثيق فئة لمزيد من التفاصيل.

scroll top