IT Share you

Log4Net "스키마 정보를 찾을 수 없습니다"메시지

shareyou 2020. 12. 15. 20:27
반응형

Log4Net "스키마 정보를 찾을 수 없습니다"메시지


새로운 웹 서비스 프로젝트의 로거로 log4net 을 사용하기로 결정했습니다 . 모든 것이 잘 작동하지만 내가 사용하는 모든 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)]

니모 추가 :

누구에게나 경고의 한마디는이 스레드의 답변의 조언을 따르십시오. 기본적으로 누구나 액세스 할 수 있으므로 웹 서비스의 루트에서 xml에 log4net 구성을 사용하면 보안 위험이 발생할 수 있습니다. 구성에 민감한 데이터가 포함 된 경우 다른 곳에 배치하는 것이 좋습니다.


@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">

누구에게나 경고의 한마디는이 스레드의 답변의 조언을 따르십시오. 기본적으로 누구나 액세스 할 수 있으므로 웹 서비스의 루트에서 xml에 log4net 구성을 사용하면 보안 위험이 발생할 수 있습니다. 구성에 민감한 데이터가 포함 된 경우 다른 곳에 배치하는 것이 좋습니다.


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 설치와 함께 작동하는 솔루션이 필요했기 때문에 제안을 시도 할 수 없었습니다.


요약하자면 문제를 해결하는 방법은 다음과 같습니다.

  1. 모든 log4net 특정 태그를 별도의 파일에 복사하십시오 xml. .xml파일 확장자 로 사용하십시오 .
  2. 에 다음 줄을 추가합니다 AssemblyInfo.cs.

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


VS2008의 경우 프로젝트에 log4net.xsd 파일을 추가하기 만하면됩니다. VS는 프로젝트 폴더와 Wheelie가 언급 한 설치 디렉토리를 찾습니다.

또한 .xml 대신 .config 확장자를 사용하면 IIS가 기본적으로 * .config 파일을 제공하지 않으므로 보안 문제를 방지 할 수 있습니다.


에서 로저의 대답은 그가 스키마를 제공, 이것은 주석이 언급 한 경우를 제외하고 나를 위해 매우 잘 작동

이 XSD는 커스텀 어 펜더 사용에 대해 불평하고 있습니다. 단순히 문자열 필드를 만드는 대신 기본 집합 (열거 형으로 정의 됨)의 appender 만 허용합니다.

xs:simpletype명명 된 원래 스키마를 수정하고 log4netAppenderTypes열거를 제거했습니다. 대신 기본 .NET 타이핑 패턴으로 제한했습니다 (기본이라고합니다. typename 만 또는 typename, 어셈블리지원 하기 때문입니다.

log4netAppenderTypesXSD에서 정의를 다음으로 바꾸기 만하면됩니다 .

<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 프로젝트를 얻은 다음 다음과 같이 만듭니다 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에 넣는 것을 볼 수 있습니다. 한 가지 차이점은 configsection 등록입니다.

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

Could the definition it as type "System.Configuration.IgnoreSectionHandler" be the reason Visual Studio does not show any warning/error messages on the log4net stuff?


I followed Kit's answer https://stackoverflow.com/a/11780781/6139051 and it didn't worked for AppenderType values like "log4net.Appender.TraceAppender, log4net". The log4net.dll assembly has the AssemblyTitle of "log4net", i.e. the assembly name does not have a dot inside, that was why the regex in Kit's answer didn't work. I has to add the question mark after the third parenthetical group in the regexp, and after that it worked flawlessly.

The modified regex looks like the following:

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

ReferenceURL : https://stackoverflow.com/questions/174430/log4net-could-not-find-schema-information-messages

반응형