2009-09-07 36 views
41

Tôi muốn gửi Cấp Thông tin & ở trên tới trình phụ trách XML và Cấp Lỗi/Mức tử vong cho trình cài đặt EventLog.Định cấu hình log4net để gửi lỗi cho các ứng dụng khác nhau dựa trên cấp

Tôi thu thập rằng tôi cần sửa đổi phần tử gốc của cấu hình nhưng tôi đang gặp khó khăn với cú pháp. Cú pháp cấu hình là gì để chuyển các bản ghi tới đúng trình ứng dụng cho một cấp hoặc phạm vi cấp nhất định?

Đây là cấu hình cho đến nay:

<log4net> 
    <appender name="SomeXmlAppender" type="log4net.Appender.RollingFileAppender"> 
    ... 
    </appender> 
    <appender name="SomeEventLogAppender" type="log4net.Appender.EventLogAppender"> 
    ... 
    </appender> 
    <root> 
    <level value="DEBUG" /> 
    <appender-ref ref="SomeXmlAppender" /> 
    <appender-ref ref="SomeEventLogAppender" /> 
    </root> 
</log4net> 

Edit: Cảm ơn @agileguy. Bài đăng đó thực sự chứa cú pháp tôi cần. Giải pháp làm việc bây giờ trông giống như sau:

<log4net> 
    <appender name="SomeXmlAppender" type="log4net.Appender.RollingFileAppender"> 
    ... 
    <evaluator type="log4net.Core.LevelEvaluator"> 
     <threshold value="INFO"/> 
    </evaluator> 
    <filter type="log4net.Filter.LevelRangeFilter"> 
     <levelMin value="INFO" /> 
     <acceptOnMatch value="true" /> 
    </filter> 
    <filter type="log4net.Filter.DenyAllFilter" /> 
    </appender> 
    <appender name="SomeEventLogAppender" type="log4net.Appender.EventLogAppender"> 
    ... 
    <evaluator type="log4net.Core.LevelEvaluator"> 
     <threshold value="ERROR"/> 
    </evaluator> 
    <filter type="log4net.Filter.LevelRangeFilter"> 
     <levelMin value="ERROR" /> 
     <acceptOnMatch value="true" /> 
    </filter> 
    <filter type="log4net.Filter.DenyAllFilter" /> 
    </appender> 
    <root> 
    <level value="DEBUG" /> 
    <appender-ref ref="SomeXmlAppender" /> 
    <appender-ref ref="SomeEventLogAppender" /> 
    </root> 
</log4net> 
+5

Lưu ý rằng một đánh giá chỉ được sử dụng bởi appenders hỗ trợ đệm. Nếu bạn muốn chỉ định một mức cụ thể cho mỗi ứng dụng, bạn chỉ cần sử dụng chính phần tử - nó không cần phải được bao bọc trong một bộ đánh giá. Phần tử – Brian

+0

chỉ nên được sử dụng cho các ứng dụng triển khai BufferingAppenderSkeleton (tức là không phải RollingFileAppender). – dave

+0

Tôi nghĩ rằng bài viết của ông Graham [ở đây] (http://weblogs.asp.net/tgraham/archive/2007/03/15/a-realistic-log4net-config.aspx) sẽ giúp bạn tiếp tục. –

Trả lời

6

Bạn có thể đặt thuộc tính ngưỡng khác nhau cho từng ứng dụng. Tất cả các sự kiện đăng nhập với mức thấp hơn mức ngưỡng đều bị bỏ qua bởi trình bổ sung. Tôi đang dán dưới hai appender, một cho các tập tin và một cho cơ sở dữ liệu (bạn nên thiết lập chuỗi kết nối của bạn). Trình bổ sung cơ sở dữ liệu có thuộc tính ngưỡng chỉ ra rằng chỉ có các lỗi sẽ được lưu trong cơ sở dữ liệu.

<configuration> 
    <log4net> 
    <!--Database appender--> 
    <appender name="DbAppender" type="log4net.Appender.ADONetAppender"> 
     <bufferSize value="0" /> 
     <connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" /> 
     <connectionString value="Data Source=AEG-PC\SQLEXPRESS;Initial Catalog=JCZ6;Uid=sa;Pwd=qwerty;" /> 
     <commandText value="INSERT INTO Log4Net ([date],[thread],[level],[logger],[message],[exception]) VALUES 
     (@log_date, @thread, @log_level, @logger, @message, @exception)" /> 
     <parameter> 
     <parameterName value="@log_date" /> 
     <dbType value="DateTime" /> 
     <layout type="log4net.Layout.RawTimeStampLayout" /> 
     </parameter> 
     <parameter> 
     <parameterName value="@thread" /> 
     <dbType value="String" /> 
     <size value="255" /> 
     <layout type="log4net.Layout.PatternLayout"> 
      <conversionPattern value="%t" /> 
     </layout> 
     </parameter> 
     <parameter> 
     <parameterName value="@log_level" /> 
     <dbType value="String" /> 
     <size value="10" /> 
     <layout type="log4net.Layout.PatternLayout"> 
      <conversionPattern value="%p" /> 
     </layout> 
     </parameter> 
     <parameter> 
     <parameterName value="@logger" /> 
     <dbType value="String" /> 
     <size value="255" /> 
     <layout type="log4net.Layout.PatternLayout"> 
      <conversionPattern value="%c" /> 
     </layout> 
     </parameter> 
     <parameter> 
     <parameterName value="@message" /> 
     <dbType value="String" /> 
     <size value="4000" /> 
     <layout type="log4net.Layout.PatternLayout"> 
      <conversionPattern value="%m" /> 
     </layout> 
     </parameter> 
     <parameter> 
     <parameterName value="@exception" /> 
     <dbType value="String" /> 
     <size value="4000" /> 
     <layout type="log4net.Layout.ExceptionLayout" /> 
     </parameter> 
     <threshold value="Error" /> <!--THIS IS THE IMPORTANT LINE--> 
    </appender> 
    <!--File appender--> 
    <appender name="FileAppender" type="log4net.Appender.FileAppender"> 
     <file value="log-file.txt" /> 
     <appendToFile value="true" /> 
     <layout type="log4net.Layout.PatternLayout"> 
     <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" /> 
     </layout> 
    </appender> 
    <root> 
     <level value="INFO" /> 
     <appender-ref ref="FileAppender" /> 
     <appender-ref ref="DbAppender" /> 
    </root> 
    </log4net> 
</configuration> 
13

Điều này có thể được thực hiện bằng cách sử dụng các yếu tố threshold hoặc filter trong ứng dụng.

Lưu ý rằng ngưỡng có thể trực tiếp bên dưới ứng dụng, nơi nó hoạt động như bộ lọc bao gồm hoặc dưới evaluator ví dụ:

<evaluator type="log4net.Core.LevelEvaluator"> 
    <threshold value="ERROR"/> 
</evaluator> 

nơi nó hoạt động như bộ lọc bao gồm để bỏ qua bộ đệm (đầu ra tức thì), nếu có.



Full lời giải thích (source):

<threshold value="ERROR" /> 

Các Threshold được thực hiện trong các AppenderSkeleton và do đó được hỗ trợ bởi hầu hết các appenders. Nó chỉ là một thử nghiệm đơn giản là được sử dụng để bỏ qua các sự kiện ghi nhật ký có cấp dưới ngưỡng. Ngưỡng được kiểm tra sớm và như một thử nghiệm đơn giản là rất trình diễn.

Có một cách khác để chỉ định hành vi tương tự như ngưỡng bằng bộ lọc. Bộ lọc linh hoạt hơn rất nhiều và vì chúng có thể là , bạn cũng có thể phát triển logic tùy chỉnh của riêng mình và chèn nó vào chuỗi bộ lọc.

<filter type="log4net.Filter.LevelRangeFilter"> 
    <levelMin value="ERROR" /> 
    <levelMax value="OFF" /> 
</filter> 

Giống như bộ lọc kiểm tra Threshold được thực hiện trong lớp cơ sở AppenderSkelton và được hỗ trợ bởi hầu hết các appenders. Bộ lọc trên có tác dụng tương tự như <threshold value="ERROR" />. Đây là một LevelRangeFilter sẽ cho phép thông qua bất kỳ sự kiện nào có cấp độ trong phạm vi ERROR đến OFF (bao gồm). Lưu ý rằng OFF là tên của cấp cao nhất, ngược lại ALL là tên của cấp độ thấp nhất.

lọc có rất nhiều tính linh hoạt vì nhiều bộ lọc có thể bị xiềng xích với nhau để cung cấp kiểm soát hạt mịn trên những sự kiện đó là đầu ra. Bởi vì điều này họ cũng có chi phí cao hơn về mặt hiệu suất , mỗi bộ lọc trong chuỗi là một đối tượng và được yêu cầu quyết định về hành động chính xác. Trong trường hợp đơn giản của ngưỡng , nên sử dụng thuộc tính Ngưỡng trong tùy chọn đối với bộ lọc.

Các Evaluator được thực hiện bởi các BufferingAppenderSkeleton và do đó chỉ được hỗ trợ bởi appenders rằng mở rộng lớp cơ sở này và cung cấp hỗ trợ cho đệm. SmtpAppender là một trong những ứng dụng .

Evaluator là một đối tượng có thể cắm được sử dụng bởi BufferingAppenderSkeleton để xác định xem sự kiện ghi nhật ký có nên không được đệm , nhưng thay vào đó được ghi/gửi ngay lập tức. Nếu Người đánh giá quyết định rằng sự kiện là quan trọng thì toàn bộ nội dung của bộ đệm hiện tại sẽ được gửi cùng với sự kiện. Bộ đánh giá không không hoạt động như ngưỡng hoặc bộ lọc ở chỗ nó không hủy sự kiện.

1

Tôi có cùng một câu hỏi. Nó xuất hiện, giả sử tôi hiểu được câu hỏi ban đầu, ngưỡng đó sẽ không hoạt động vì nó sẽ gửi một số đầu ra cho một appender và cộng với phần còn lại cho appender kia. Tôi đã có thể làm cho nó làm việc bằng cách sử dụng LevelRangeFilter như đề xuất ở trên. Tôi muốn ERROR, INFO và WARN để đi đến một appender và tất cả những người khác để đi đến appender khác, nhưng không phải ERROR, INFO và WARN.

Dưới đây là các cấu hình mà làm việc cho tôi:

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <configSections> 
     <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" /> 
    </configSections> 
    <log4net> 
     <appender name="LoggingAppender" type="log4net.Appender.FileAppender" > 
      <file value="logs.txt" /> 
      <filter type="log4net.Filter.LevelRangeFilter"> 
       <levelMin value="INFO"/> 
       <levelMax value="OFF"/> 
      </filter> 
      <layout type="log4net.Layout.PatternLayout"> 
       <conversionPattern value="%date [%thread] %-5level %logger [%ndc] - %message%newline" /> 
      </layout> 
     </appender> 
     <appender name="TracingAppender" type="log4net.Appender.FileAppender" > 
      <file value="traces.txt" /> 
      <filter type="log4net.Filter.LevelRangeFilter"> 
       <levelMin value="ALL"/> 
       <levelMax value="DEBUG"/> 
      </filter> 
      <layout type="log4net.Layout.PatternLayout"> 
       <conversionPattern value="%date [%thread] %-5level %logger [%ndc] - %message%newline" /> 
      </layout> 
     </appender> 
     <root> 
      <appender-ref ref="LoggingAppender"/> 
      <appender-ref ref="TracingAppender"/> 
     </root> 
    </log4net> 
</configuration> 

Cảm ơn, Nick

Các vấn đề liên quan