新しいWebサービスプロジェクトのロガーとして log4net を使用することにしました。すべて正常に動作していますが、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>
解決済み:
xml
-ファイルにコピーします。ファイル拡張子として必ず.xml
を使用してください。AssemblyInfo.cs
に次の行を追加します。[Assembly: log4net.Config.XmlConfigurator(ConfigFile = "xmlFile.xml", Watch = true)]
nemo 追加:
誰にでも警告の言葉がこのスレッドの答えのアドバイスに従います。デフォルトでだれでもアクセスできるため、log4net構成をWebサービスのルートから離れた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
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インストールで動作するソリューションが必要だったため、提案を試すことができませんでした。
要約すると、問題の解決方法は次のとおりです。
xml
-ファイルにコピーします。必ず_.xml
_をファイル拡張子として使用してください。_AssemblyInfo.cs
_に次の行を追加します。
[Assembly: log4net.Config.XmlConfigurator(ConfigFile = "xmlFile.xml", Watch = true)]
VS2008の場合、log4net.xsdファイルをプロジェクトに追加するだけです。 VSは、Wheelieが言及したインストールディレクトリだけでなく、プロジェクトフォルダーも検索します。
また、IISはデフォルトでは* .configファイルを提供しないため、.xmlの代わりに.config拡張子を使用すると、セキュリティの問題を回避できます。
ロジャーの答え では、彼がスキーマを提供しましたが、これはコメンターが言及した場合を除いて私にとって非常にうまく機能しました
このXSDは、カスタムアペンダーの使用について不平を言っています。これを単純に文字列フィールドにするのではなく、デフォルトセット(enumとして定義)からのアペンダーのみを許可します
xs:simpletype
という名前のlog4netAppenderTypes
を持つ元のスキーマを変更し、列挙を削除しました。代わりに、基本的な.NETタイピングパターンに制限しました(typenameのみ、またはのみをサポートしているため、basicと言います) 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>
上記のようにxsdファイルをVisual Studioのスキーマフォルダーに配置して(私にとっては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>
別のlog4net.configファイルを使用してみましたか?
少し遅れていることに気づきましたが、log4netの例の例を見ると、すべての構成データがapp.configに置かれていることがわかります。1つの違いは、configsectionの登録です:
<!-- Register a section handler for the log4net section -->
<configSections>
<section name="log4net" type="System.Configuration.IgnoreSectionHandler" />
</configSections>
タイプ「System.Configuration.IgnoreSectionHandler」としての定義が、Visual Studioがlog4netに警告/エラーメッセージを表示しない理由でしょうか?
Visual Studioのインストールを変更せずに、適切なバージョン管理などを考慮します。チームの他のメンバーの間で、.xsdファイルをソリューションに(「ソリューションアイテム」として)追加するか、特定のプロジェクトにのみ必要な場合は、そこに埋め込みます。
私は Kit の答え https://stackoverflow.com/a/11780781/6139051 に従いましたが、「log4net.Appender.TraceAppender、 log4net」。 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*)?+)?"/>