سؤال

قررت استخدام log4net كمسجل لمشروع خدمة WebService جديدة. كل شيء يعمل بشكل جيد ، لكنني أتلقى الكثير من الرسائل مثل الرسائل أدناه ، لكل علامة log4net التي أستخدمها في بلدي web.config:

لا يمكن العثور على معلومات المخطط لعنصر "log4net" ...

فيما يلي الأجزاء ذات الصلة الخاصة بي web.config:

  <configSections>
    <section name="log4net" 
        type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
  </configSections>
  <log4net>
    <appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">
      <file value="C:\log.txt" />
      <appendToFile value="true" />
      <rollingStyle value="Size" />
      <maxSizeRollBackups value="10" />
      <maximumFileSize value="100KB" />
      <staticLogFileName value="true" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date [%thread] %-5level: %message%newline" />
      </layout>
    </appender>
    <logger name="TIMServerLog">
      <level value="DEBUG" />
      <appender-ref ref="RollingFileAppender" />
    </logger>
  </log4net>

تم حلها:

  1. انسخ كل علامة محددة من log4net إلى منفصلة xml-ملف. تأكد من الاستخدام .xml كملحق ملف.
  2. أضف السطر التالي إلى AssemblyInfo.cs:
[assembly: log4net.Config.XmlConfigurator(ConfigFile = "xmlFile.xml", Watch = true)]

نيمو إضافة:

مجرد كلمة تحذير لأي شخص اتبع نصيحة الإجابات في هذا الموضوع. هناك مخاطر أمان محتملة من خلال تكوين log4net في XML من جذر خدمة الويب ، حيث سيكون متاحًا لأي شخص افتراضيًا. فقط يجب أن ننصح إذا كان التكوين الخاص بك يحتوي على بيانات حساسة ، فقد ترغب في وضعه في مكان آخر.


WCM: حاولت استخدام ملف منفصل. أضفت السطر التالي إلى AssemblyInfo.cs

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

ووضع كل شيء يتعامل مع log4net في هذا الملف ، لكنني ما زلت أتلقى نفس الرسائل.

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

المحلول

كان لديّ خذ مختلف ، وكنت بحاجة إلى بناء الجملة التالي:

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

وهو ما يختلف عن آخر مشاركة لـ XSL ، لكنه أحدث فرقًا بالنسبة لي. ألق نظرة على هذا مشاركة مدونة, ، لقد ساعدني ذلك.

نصائح أخرى

يمكنك الربط في مخطط إلى log4net عنصر. هناك عدد قليل من العائمة ، ومعظمهم لا يوفرون تمامًا الخيارات المختلفة المتاحة. لقد قمت بإنشاء XSD التالي لتوفير أكبر قدر ممكن من التحقق:http://csharptest.net/downloads/schema/log4net.xsd

يمكنك ربطه في XML بسهولة عن طريق تعديل log4net عنصر:

<log4net 
     xsi:noNamespaceSchemaLocation="http://csharptest.net/downloads/schema/log4net.xsd" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

مجرد كلمة تحذير لأي شخص اتبع نصيحة الإجابات في هذا الموضوع. هناك مخاطر أمان محتملة من خلال تكوين log4net في XML من جذر خدمة الويب ، حيث سيكون متاحًا لأي شخص افتراضيًا. فقط يجب أن ننصح إذا كان التكوين الخاص بك يحتوي على بيانات حساسة ، فقد ترغب في وضعه في مكان آخر.

أعتقد أنك ترى الرسالة لأن Visual Studio لا يعرف كيفية التحقق من صحة قسم Log4Net في ملف التكوين. يجب أن تكون قادرًا على إصلاح هذا عن طريق نسخ Log4Net XSD إلى C: Program Files Microsoft Visual Studio 8 XML Schemas (أو في أي مكان تثبيت Visual Studio). كمكافأة إضافية ، يجب عليك الآن الحصول على دعم Intellisense لـ log4net

في الواقع لا تحتاج إلى التمسك بتمديد .xml. يمكنك تحديد أي امتداد آخر في سمة configfilextension:

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

steve_mtl: تغيير ملحقات الملف من .config إلى .xml حل المشكلة. شكرًا لك.

WHEELIE: لم أستطع تجربة اقتراحك ، لأنني كنت بحاجة إلى حل يعمل مع تثبيت Visual Studio غير المعدل.


لتلخيصها ، إليك كيفية حل المشكلة:

  1. انسخ كل علامة محددة من log4net إلى منفصلة xml-ملف. تأكد من الاستخدام .xml كملحق ملف.
  2. أضف السطر التالي إلى AssemblyInfo.cs:

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

بالنسبة لـ VS2008 ، فقط أضف ملف log4net.xsd إلى مشروعك ؛ VS يبحث في مجلد المشروع وكذلك دليل التثبيت الذي ذكره Wheelie.

أيضًا ، باستخدام ملحق .Config بدلاً من .xml يتجنب مشكلة الأمان لأن IIS لا يخدم ملفات .Config افتراضيًا.

في إجابة روجر, ، حيث قدم مخططًا ، عمل هذا جيدًا بالنسبة لي إلا حيث ذكر المعلق

يشكو XSD هذا من استخدام الملاحق المخصصة. يسمح فقط بملحق من المجموعة الافتراضية (المعرّفة على أنها تعداد) بدلاً من مجرد جعل هذا الحقل سلسلة

لقد قمت بتعديل المخطط الأصلي الذي كان xs:simpletype اسم الشيئ log4netAppenderTypes وإزالة التعدادات. بدلاً من ذلك ، قمت بتقييده على نمط كتابة .NET أساسي (أقول أساسي لأنه يدعم فقط أكتب اسم فقط ، أو Typename ، التجميع - ومع ذلك يمكن لشخص ما تمديده.

ببساطة استبدال log4netAppenderTypes التعريف مع ما يلي في XSD:

<xs:simpleType name="log4netAppenderTypes">
  <xs:restriction base="xs:string">
    <xs:pattern value="[A-Za-z_]\w*(\.[A-Za-z_]\w*)+(\s*,\s*[A-Za-z_]\w*(\.[A-Za-z_]\w*)+)?"/>
  </xs:restriction>
</xs:simpleType>

أنا أعود إلى المؤلف الأصلي إذا أراد تضمينه في نسخته الرسمية. حتى ذلك الحين ، يتعين عليك تنزيل XSD وتعديله والرجوع إليه بطريقة نسبية ، على سبيل المثال:

<log4net
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:noNamespaceSchemaLocation="../../../Dependencies/log4net/log4net.xsd">
  <!-- ... -->
</log4net>

هل حاولت استخدام ملف log4net.config منفصل؟

حصلت على مشروع اختبار ASP للبناء عن طريق وضع ملف XSD في مجلد Visual Studio Schemas كما هو موضح أعلاه (بالنسبة لي هو C: Program Files Microsoft Visual Studio 8 XML Schemas) ثم صنع بلدي web.config يبدو مثل هذا:

<?xml version="1.0"?>
<!-- 
    Note: As an alternative to hand editing this file you can use the 
    web admin tool to configure settings for your application. Use
    the Website->Asp.Net Configuration option in Visual Studio.
    A full list of settings and comments can be found in 
    machine.config.comments usually located in 
    \Windows\Microsoft.Net\Framework\v2.x\Config 
-->
<configuration>
  <configSections>


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

  </configSections>
  <appSettings>

  </appSettings>
  <connectionStrings>

  </connectionStrings>
  <system.web>
    <trace enabled="true" pageOutput="true"  />
    <!-- 
            Set compilation debug="true" to insert debugging 
            symbols into the compiled page. Because this 
            affects performance, set this value to true only 
            during development.
        -->
    <compilation debug="true" />
    <!--
            The <authentication> section enables configuration 
            of the security authentication mode used by 
            ASP.NET to identify an incoming user. 
        -->
    <authentication mode="Windows" />

    <customErrors mode="Off"/>
    <!--
      <customErrors mode="Off"/>

            The <customErrors> section enables configuration 
            of what to do if/when an unhandled error occurs 
            during the execution of a request. Specifically, 
            it enables developers to configure html error pages 
            to be displayed in place of a error stack trace.

    <customErrors mode="On" defaultRedirect="GenericErrorPage.htm">
      <error statusCode="403" redirect="NoAccess.htm" />
      <error statusCode="404" redirect="FileNotFound.htm" />
    </customErrors>
        -->





  </system.web>
    <log4net xsi:noNamespaceSchemaLocation="http://csharptest.net/downloads/schema/log4net.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
      <appender name="LogFileAppender" type="log4net.Appender.FileAppender">
      <!-- Please make shure the ..\\Logs directory exists! -->
      <param name="File" value="Logs\\Log4Net.log"/>
      <!--<param name="AppendToFile" value="true"/>-->
      <layout type="log4net.Layout.PatternLayout">
        <param name="ConversionPattern" value="%d [%t] %-5p %c %m%n"/>
      </layout>
    </appender>
    <appender name="SmtpAppender" type="log4net.Appender.SmtpAppender">
      <to value="" />
      <from value="" />
      <subject value="" />
      <smtpHost value="" />
      <bufferSize value="512" />
      <lossy value="true" />
      <evaluator type="log4net.Core.LevelEvaluator">
        <threshold value="WARN"/>
      </evaluator>
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%newline%date [%thread] %-5level %logger [%property] - %message%newline%newline%newline" />
      </layout>
    </appender>

    <logger name="File">
      <level value="ALL" />
      <appender-ref ref="LogFileAppender" />
    </logger>
    <logger name="EmailLog">
      <level value="ALL" />
      <appender-ref ref="SmtpAppender" />
    </logger>
  </log4net>
</configuration>

دون تعديل تثبيت Visual Studio الخاص بك ، ولأخذ في الاعتبار الإصدار المناسب/إلخ. من بين بقية فريقك ، أضف ملف .xsd إلى الحل الخاص بك (كعنصر حل ") ، أو إذا كنت تريده فقط لمشروع معين ، فقط قم بتضمينه هناك.

لقد لاحظت ذلك متأخراً بعض الشيء ، ولكن إذا نظرت إلى الأمثلة ، يمكنك تسجيل الدخول ، يمكنك رؤيتها تضع جميع بيانات التكوين في app.config ، مع اختلاف واحد ، تسجيل التكوينات:

<!-- Register a section handler for the log4net section -->
<configSections>
    <section name="log4net" type="System.Configuration.IgnoreSectionHandler" />
</configSections>

هل يمكن أن يكون تعريفه على أنه نوع "system.configuration.ignoresectionHandler" هو السبب في أن Visual Studio لا يعرض أي رسائل تحذير/خطأ على أشياء log4net؟

تتبعت عدةإجابة https://stackoverflow.com/a/11780781/6139051 ولم ينجح الأمر في قيم AppenderType مثل "log4net.appender.traceappender ، log4net". تحتوي مجموعة log4net.dll على مجموعة من "log4net" ، أي أن اسم التجميع لا يحتوي على نقطة في الداخل ، وهذا هو السبب في أن إجابة regex في Kit لم تنجح. يجب أن أضيف علامة الاستفهام بعد المجموعة الثالثة بين الأقواس في RegexP ، وبعد ذلك عملت بلا عيب.

يشبه Regex المعدل ما يلي:

<xs:pattern value="[A-Za-z_]\w*(\.[A-Za-z_]\w*)+(\s*,\s*[A-Za-z_]\w*(\.[A-Za-z_]\w*)?+)?"/>
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top