Log4Net“スキーマ情報が見つかりませんでした”メッセージ
-
05-07-2019 - |
質問
log4net を新しいWebサービスプロジェクトのロガーとして使用することにしました。すべてが正常に機能していますが、 web.config
で使用しているすべてのlog4netタグについて、以下のような多くのメッセージが表示されます:
のスキーマ情報が見つかりませんでした 要素 '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)]
nemo が追加されました:
誰にでも警告の言葉を の回答のアドバイスに従ってください このスレッド。可能性があります log4netを使用することによるセキュリティリスク ルートからのXMLでの構成 Webサービスの デフォルトで誰でもアクセスできます。ただ あなたの構成の場合に助言されます 機密データが含まれている場合があります 他の場所に配置します。
@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
log4net
要素を変更することで、XMLに簡単にバインドできます:
<log4net
xsi:noNamespaceSchemaLocation="http://csharptest.net/downloads/schema/log4net.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
このスレッドの回答のアドバイスに従うと、だれにも警告の言葉があります。デフォルトで誰でもアクセスできるため、log4net構成をWebサービスのルートからxmlに持つことにより、セキュリティ上のリスクが生じる可能性があります。設定に機密データが含まれている場合はご注意ください。別の場所に配置することもできます。
Visual Studioは構成ファイルのlog4netセクションを検証する方法を知らないため、メッセージが表示されていると思います。これを修正するには、log4net XSDをC:\ Program Files \ Microsoft Visual Studio 8 \ XML \ Schemas(またはVisual Studioがインストールされている場所)にコピーします。追加ボーナスとして、log4netのインテリセンスサポートを取得する必要があります
実際には、.xml拡張子に固執する必要はありません。 ConfigFileExtension属性で他の拡張子を指定できます。
[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 =&quot; xmlFile.xml&quot ;, Watch = true)]
VS2008の場合、log4net.xsdファイルをプロジェクトに追加するだけです。 VSは、Wheelieが言及したインストールディレクトリだけでなくプロジェクトフォルダーも検索します。
また、IISはデフォルトで* .configファイルを提供しないため、.xmlの代わりに.config拡張子を使用すると、セキュリティの問題を回避できます。
ロジャーの答えでは、彼がスキーマを提供しましたが、これはコメンターが言及した場合を除いて私にとって非常にうまくいきました
このXSDは、カスタムアペンダーの使用について不満を言っています。これを単純に文字列フィールドにするのではなく、デフォルトセット(enumとして定義)のアペンダーのみを許可します
log4netAppenderTypes
という名前の xs:simpletype
を持つ元のスキーマを変更し、列挙を削除しました。代わりに、基本的な.NET型付けパターンに制限しました( typename のみ、または typename、assembly のみをサポートしているため、基本と言いますが、誰かが拡張できます。
XSDで log4netAppenderTypes
の定義を次のものに置き換えるだけです。
<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ファイルを使用してみましたか?
上記のようにVisual Studioスキーマフォルダーにxsdファイルを配置して(私にとってはC:\ Program Files \ Microsoft Visual Studio 8 \ XML \ Schemas)、ビルドするテストASPプロジェクトを取得し、< code> 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ファイルをソリューションに(「ソリューションアイテム」として)追加するか、特定のプロジェクトにのみ必要な場合は、そこに埋め込みます。
少し遅れましたが、log4netのサンプルを見ると、すべての構成データがapp.configに置かれていることがわかります。
<!-- Register a section handler for the log4net section -->
<configSections>
<section name="log4net" type="System.Configuration.IgnoreSectionHandler" />
</configSections>
タイプとして定義できます&quot; System.Configuration.IgnoreSectionHandler&quot; Visual Studioがlog4netに警告/エラーメッセージを表示しない理由は何ですか?
キットの回答 https://stackoverflow.com/a/11780781/6139051 で、&quot; log4net.Appender.TraceAppender、log4net&quot;のようなAppenderType値では機能しませんでした。 log4net.dllアセンブリにはAssemblyTitleの「log4net」があります。つまり、アセンブリ名にドットが含まれていないため、キットの答えの正規表現が機能しませんでした。正規表現の3番目の括弧グループの後に疑問符を追加する必要があります。その後、問題なく機能しました。
変更された正規表現は次のようになります。
<xs:pattern value="[A-Za-z_]\w*(\.[A-Za-z_]\w*)+(\s*,\s*[A-Za-z_]\w*(\.[A-Za-z_]\w*)?+)?"/>