log4net "لا يمكن العثور على معلومات المخطط"
-
05-07-2019 - |
سؤال
قررت استخدام 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>
تم حلها:
- انسخ كل علامة محددة من log4net إلى منفصلة
xml
-ملف. تأكد من الاستخدام.xml
كملحق ملف. - أضف السطر التالي إلى
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 غير المعدل.
لتلخيصها ، إليك كيفية حل المشكلة:
- انسخ كل علامة محددة من log4net إلى منفصلة
xml
-ملف. تأكد من الاستخدام.xml
كملحق ملف. أضف السطر التالي إلى
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*)?+)?"/>