web-dev-qa-db-ja.com

Log4Net「スキーマ情報が見つかりませんでした」メッセージ

新しい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>

解決済み:

  1. すべてのlog4net固有のタグを個別のxml-ファイルにコピーします。ファイル拡張子として必ず.xmlを使用してください。
  2. 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を扱うすべてのものをそのファイルに入れますが、それでも同じメッセージが表示されます。

56
xsl

別のテイクがあり、次の構文が必要でした:

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

これはxslの前回の投稿とは異なりますが、私にとっては違いがありました。これを確認してください ブログ投稿 、助けてくれました。

17
steve_mtl

スキーマを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">
68
Roger

誰にでも警告の言葉がこのスレッドの答えのアドバイスに従います。デフォルトで誰でもアクセスできるため、log4net構成をWebサービスのルートからxmlに持つことにより、セキュリティ上のリスクが生じる可能性があります。構成に機密データが含まれている場合は注意してください。別の場所に配置することもできます。

9
James McMahon

Visual Studioは構成ファイルのlog4netセクションを検証する方法を知らないため、メッセージが表示されていると思います。これを修正するには、log4net XSDをC:\ Program Files\Microsoft Visual Studio 8\XML\Schemas(またはVisual Studioがインストールされている場所)にコピーします。追加のボーナスとして、log4netのインテリセンスサポートを取得する必要があります。

5
Wheelie

実際には、拡張子.xmlに固執する必要はありません。 ConfigFileExtension属性で他の拡張子を指定できます。

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

@steve_mtl:ファイル拡張子を_.config_から_.xml_に変更すると、問題が解決しました。ありがとうございました。

@Wheelie:変更されていないVisual Studioインストールで動作するソリューションが必要だったため、提案を試すことができませんでした。


要約すると、問題の解決方法は次のとおりです。

  1. すべてのlog4net固有のタグを個別のxml-ファイルにコピーします。必ず_.xml_をファイル拡張子として使用してください。
  2. _AssemblyInfo.cs_に次の行を追加します。

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

2
xsl

VS2008の場合、log4net.xsdファイルをプロジェクトに追加するだけです。 VSは、Wheelieが言及したインストールディレクトリだけでなく、プロジェクトフォルダーも検索します。

また、IISはデフォルトでは* .configファイルを提供しないため、.xmlの代わりに.config拡張子を使用すると、セキュリティの問題を回避できます。

2
devstuff

ロジャーの答え では、彼がスキーマを提供しましたが、これはコメンターが言及した場合を除いて私にとって非常にうまく機能しました

この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>
2
Kit

上記のように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>
1
mark simmons

別のlog4net.configファイルを使用してみましたか?

1
wcm

少し遅れていることに気づきましたが、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に警告/エラーメッセージを表示しない理由でしょうか?

0
Fysicus

Visual Studioのインストールを変更せずに、適切なバージョン管理などを考慮します。チームの他のメンバーの間で、.xsdファイルをソリューションに(「ソリューションアイテム」として)追加するか、特定のプロジェクトにのみ必要な場合は、そこに埋め込みます。

0
Matt Enright

私は 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*)?+)?"/>
0
Volodymyr