2008-10-06 14 views
53

Tôi quyết định sử dụng log4net làm trình ghi nhật ký cho dự án webservice mới. Tất cả mọi thứ đang làm việc tốt, nhưng tôi nhận được rất nhiều tin nhắn như hình dưới đây, cho mỗi thẻ log4net Tôi đang sử dụng trong web.config tôi:Log4Net "Không thể tìm thấy thông tin lược đồ"

Không thể tìm thấy thông tin schema cho yếu tố 'log4net' ...

Dưới đây là những phần liên quan của web.config tôi:

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

quyết:

  1. Sao chép mỗi thẻ cụ thể của log4net vào một xml -file riêng biệt. Đảm bảo sử dụng .xml làm đuôi tệp.
  2. Thêm dòng sau vào AssemblyInfo.cs:
[assembly: log4net.Config.XmlConfigurator(ConfigFile = "xmlFile.xml", Watch = true)] 

nemo thêm:

Chỉ cần một lời cảnh báo cho bất cứ ai theo lời khuyên của các câu trả lời trong chủ đề này. Có thể có rủi ro bảo mật có thể là bằng cách đặt cấu hình log4net trong xml ngoài gốc của dịch vụ web, vì nó sẽ là có thể truy cập được cho bất kỳ ai theo mặc định. Chỉ cần được thông báo nếu cấu hình của bạn chứa dữ liệu nhạy cảm, bạn có thể muốn để đặt nó ở nơi khác.


@wcm: Tôi đã thử sử dụng một tệp riêng biệt. Tôi đã thêm dòng sau vào AssemblyInfo.cs

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

và đặt tất cả mọi thứ đối phó với log4net trong tập tin đó, nhưng tôi vẫn nhận được những thông điệp tương tự.

Trả lời

17

Tôi đã có một mất khác nhau, và cần cú pháp sau:

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

mà khác với bài cuối cùng xsl, nhưng làm nên sự khác biệt đối với tôi. Kiểm tra này blog post, nó đã giúp tôi ra ngoài.

+0

Trong khi nó làm việc cho tôi, trong Debug Output nó đã cảnh báo về thiếu các phần trong tập tin cấu hình chính. Vì vậy, tôi đã phải giữ chúng nhưng trống rỗng như thế này ' 'để làm cho cảnh báo biến mất –

1

Bạn đã thử sử dụng tệp log4net.config riêng biệt chưa?

5

Tôi tin rằng bạn đang nhìn thấy thông báo vì Visual Studio không biết cách xác thực phần log4net của tệp cấu hình. Bạn sẽ có thể khắc phục điều này bằng cách sao chép log4net XSD vào C: \ Program Files \ Microsoft Visual Studio 8 \ XML \ Schemas (hoặc bất cứ nơi nào Visual Studio của bạn được cài đặt). Là một tiền thưởng thêm bây giờ bạn sẽ nhận được hỗ trợ IntelliSense cho log4net

+0

này không làm việc cho tôi. –

+4

Đối với VS 2010, đặt log4net XSD được đề cập ở trên vào C: \ Program Files \ Microsoft Visual Studio 10.0 \ XML \ Schemas. Đóng và mở lại VS. Mở tệp .config, chuyển đến mục trình đơn XML -> Schemas, nhấp vào log4net.xsd và "Sử dụng lược đồ này" –

+0

@PeterM. điều này làm việc cho tôi. Berry Nice! – IbrarMumtaz

2

@steve_mtl: Thay đổi phần mở rộng tệp từ .config thành .xml giải quyết được sự cố. Cảm ơn bạn.

@Wheelie: Tôi không thể thử đề xuất của bạn, bởi vì tôi cần một giải pháp hoạt động với cài đặt Visual Studio chưa sửa đổi.


Nói tóm lại, đây là làm thế nào để giải quyết vấn đề:

  1. Sao chép mỗi log4net thẻ cụ thể cho một xml -file riêng biệt. Đảm bảo sử dụng .xml làm đuôi tệp.
  2. Thêm dòng sau vào AssemblyInfo.cs:

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

67

Bạn có thể ràng buộc trong một schema để các yếu tố log4net. Có một vài nổi xung quanh, hầu hết không cung cấp đầy đủ cho các tùy chọn khác nhau có sẵn. Tôi tạo ra xsd sau để cung cấp càng nhiều xác minh càng tốt: http://csharptest.net/downloads/schema/log4net.xsd

Bạn có thể gắn nó vào xml dễ dàng bằng cách sửa đổi log4net yếu tố:

<log4net 
    xsi:noNamespaceSchemaLocation="http://csharptest.net/downloads/schema/log4net.xsd" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
+9

Rất lạ rằng log4net không bao gồm một XSD. –

+0

Đã không thực sự có được xung quanh để cố gắng này trong một thời gian, tôi không thể làm cho nó hoạt động theo visual studio 2005. Vâng nó hoạt động, nhưng nó vẫn ném cảnh báo về tất cả các yếu tố XML. –

+4

XSD này đang phàn nàn về việc sử dụng các ứng dụng tùy chỉnh. Nó chỉ cho phép một appender từ tập mặc định (được định nghĩa là enum) thay vì chỉ đơn giản là làm cho một trường chuỗi này là –

8

Chỉ cần một lời cảnh báo cho bất cứ ai làm theo những lời khuyên của các câu trả lời trong chủ đề này. Có một nguy cơ bảo mật có thể xảy ra khi có cấu hình log4net trong xml ngoài gốc của dịch vụ web, vì nó sẽ có thể truy cập được với bất kỳ ai theo mặc định. Chỉ cần được thông báo nếu cấu hình của bạn chứa dữ liệu nhạy cảm, bạn có thể muốn đặt nó ở nơi khác.

+10

Giải pháp tốt hơn là sử dụng phần mở rộng '.config' thay vì' .xml'. IIS sẽ chặn các yêu cầu tới .configs theo mặc định – STW

2

Đối với VS2008, chỉ cần thêm tệp log4net.xsd vào dự án của bạn; VS tìm trong thư mục dự án cũng như thư mục cài đặt mà Wheelie đã đề cập.

Ngoài ra, sử dụng phần mở rộng .config thay vì .xml tránh vấn đề bảo mật vì IIS không phân phối tệp * .config theo mặc định.

3

Thực ra bạn không cần phải tuân theo phần mở rộng .xml. Bạn có thể chỉ định bất kỳ phần mở rộng khác trong thuộc tính ConfigFileExtension:

[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", ConfigFileExtension=".config", Watch = true)] 
1

tôi có một dự án thử nghiệm asp để xây dựng bởi puting file xsd trong thư mục schemas visual studio như mô tả ở trên (đối với tôi nó là C: \ Program Files \ Microsoft Visual Studio 8 \ XML \ Schemas) và sau đó làm web.config nhìn tôi như thế này:

<?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> 
0

Nếu không có thay đổi cài đặt Visual Studio của bạn, và để đưa vào tài khoản phiên bản thích hợp/etc. trong số những người còn lại trong nhóm của bạn, hãy thêm tệp .xsd vào giải pháp của bạn (dưới dạng 'Mục Giải pháp') hoặc nếu bạn chỉ muốn nó cho một dự án cụ thể, chỉ cần nhúng nó vào đó.

2

Trong Roger's answer, nơi ông được cung cấp một sơ đồ, điều này làm việc rất tốt cho tôi trừ trường hợp một commenter đề cập

XSD này được phàn nàn về việc sử dụng appenders tùy chỉnh.Nó chỉ cho phép một appender từ giá trị mặc định (được định nghĩa như một enum) thay vì chỉ đơn giản là làm cho này lĩnh vực một chuỗi

tôi sửa đổi giản đồ gốc mà đã có một xs:simpletype tên log4netAppenderTypes và loại bỏ các kiểu liệt kê. Tôi thay vì hạn chế nó đến một mô hình .NET gõ cơ bản (tôi nói cơ bản bởi vì nó chỉ hỗ trợ typename chỉ, hoặc typename, lắp ráp -. Tuy nhiên ai đó có thể mở rộng nó

Đơn giản chỉ cần thay đổi định nghĩa log4netAppenderTypes như sau trong 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> 

tôi đang đi qua lại này trên cho tác giả gốc nếu ông muốn đưa nó vào trong phiên bản chính thức của mình đến lúc đó bạn phải tải về và sửa đổi các XSD và tham khảo nó trong một. tương đối, ví dụ:

<log4net 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:noNamespaceSchemaLocation="../../../Dependencies/log4net/log4net.xsd"> 
    <!-- ... --> 
</log4net> 
+0

Điều này thực sự là do thiết kế và có nhiều sự kiện ngắn hơn trong lược đồ này.Mục đích của nó là cung cấp một phương tiện cho VStudio để cung cấp trợ giúp intelli-sense cho người mới (như tôi đã ở thời điểm đó). Sử dụng XSD với các kiểu tùy chỉnh sẽ cho bạn một cảnh báo; tuy nhiên, người đọc không xác nhận và vì vậy nó sẽ hoạt động tốt. Bạn có thể sử dụng một XSD tùy chỉnh, hoặc đơn giản là bỏ qua lỗi. –

0

tôi nhận thấy nó hơi muộn, nhưng nếu bạn nhìn vào các ví dụ log4net cung cấp dịch bạn có thể nhìn thấy chúng đưa tất cả các dữ liệu cấu hình thành một app.config, với một sự khác biệt, việc đăng ký configsection:

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

Có thể định nghĩa nó là loại "System.Configuration.IgnoreSectionHandler" là lý do Visual Studio không hiển thị bất kỳ cảnh báo/thông báo lỗi nào trên công cụ log4net?

0

Tôi đã theo dõi câu trả lời của Kithttps://stackoverflow.com/a/11780781/6139051 và không hoạt động đối với các giá trị AppenderType như "log4net.Appender.TraceAppender, log4net". Việc lắp ráp log4net.dll có AssemblyTitle của "log4net", tức là tên lắp ráp không có dấu chấm bên trong, đó là lý do tại sao regex trong câu trả lời của Kit không hoạt động. Tôi phải thêm dấu chấm hỏi sau nhóm thứ ba trong nhóm regexp, và sau đó nó hoạt động hoàn hảo.

Các regex sửa đổi trông giống như sau:

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