Log4net – Configuration log4net Nâng Cao (các filter nâng cao)

Hôm nay tôi sẽ hướng dẫn các bạn một số kỹ thuật với log4net, 3 kỹ thuật chúng ta cần nắm sau bài này là “Làm sao để tạo các file log riêng cho từng namspace”, “Làm sao để các file log tự động được ghi vào thư mục có tên tương ứng với ngày hiện tại” và “làm sao để lọc thông tin cho một file log – nâng cao”. Mời các bạn cùng theo dõi.

Bài trước…

Bài liên quan: Common.Logging là gì?

I> Tạo file riêng cho từng namspace

Để tạo một tập tin/kiểu log chúng ta thêm vào file config một thẻ appender với các thông số cở bản như bài trước và để tiến hành log cho một namspace ta dùng thẻ logger.

Format config như sau

<!-- name của  appender là tên bất kỳ-->
<appender name="rootTrace">
	<!-- param -->
</appender>
<appender name="MyCompany">
	<!-- param -->
</appender>
<appender name="MyCompany.MyCompany1">
	<!-- param -->
</appender>
<appender name="MyCompany.MyCompany2">
	<!-- param -->
</appender>

<root>
 <level value="ALL"/>
 <appender-ref ref="rootTrace"/>
</root>

<!-- name của logger chính là namespace muốn lọc-->
<logger name="MyCompany">
 <level value="WARN" />
 <!-- ref đến một appender-->
 <appender-ref ref="MyCompany" />
</logger>
<logger name="MyCompany.MyCompany1">
 <level value="WARN" />
 <appender-ref ref="MyCompany.MyCompany1" />
</logger>
<logger name="MyCompany.MyCompany2">
 <level value="DEBUG" />
 <appender-ref ref="MyCompany.MyCompany2" />
</logger>

Ví dụ: Chúng ta sẽ có một file log  với tên “myLog.log“, chứa toàn bộ log sinh ra từ namespace “Namespace.subNamespace” và loglevel = “DEBUG

<!-- config appender với type = RollingFileAppender-->
 <appender name="myApenName" type="log4net.Appender.RollingFileAppender">
    <file value="..\log\myLog.log"/>
    <appendToFile value="true"/>
    <rollingStyle value="Size"/>
    <maximumFileSize value="25MB"/>
    <maxSizeRollBackups value="100"/>
    <staticLogFileName value="true"/>
    <countDirection value="0"/>
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%date{yyyy/MM/dd HH:mm:ss.fff} %-5level [%-4thread] %logger - %message%newline" />
    </layout>
  </appender>

  <logger name="Namespace.subNamespace">
    <level value="DEBUG" />
    	<!-- refer đến appender bạn muốn-->
    <appender-ref ref="myApenName" />
  </logger>

  <root>
    <level value="INFO" />
    	<!-- <appender-ref ref="myApenName"/> -->
  </root>

Lưu ý rằng: chúng ta không nên refer đến appender “myApenName” trong thẻ root vì thế này đồng nghĩa với việc log tất cả các namespace

 II> Cách tạo các file log trong một thư mục được đặt tên theo ngày

Cụ thể là nếu hôm nay ngày 03/03/2015 thì chúng ta sẽ có thư mục mang tên “03-03-2015“, thư mục này chứa tất cả các file log được tạo ra đúng ngày hôm nay.
Xem ví dụ sau đây,

<appender name="Alllog" type="log4net.Appender.RollingFileAppender">
    <!-- (1) -->
    <param name="File" value="../Log/" />
    <param name="DatePattern" value='yyyy-MM-dd"/Alllog.log"' />
    <!-- (2) -->
    <param name="StaticLogFileName" value="false" />
    <param name="RollingStyle" value="Composite" />
    <param name="AppendToFile" value="true" />
    <param name="MaximumFileSize" value="5MB" />
    <param name="MaxSizeRollBackups" value="50" />
    <encoding value="utf-8" />
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%date{yyyy/MM/dd HH:mm:ss.fff} %-5level [%-4thread] %logger - %message%newline" />
    </layout>
    <filter type="log4net.Filter.StringMatchFilter">
      <stringToMatch value="test" />
    </filter>
    <filter type="log4net.Filter.DenyAllFilter" />
  </appender>

Các bạn chú ý hai thẻ mà tôi đặc giữa hai số (1)(2); Dòng đầu chúng ta dùng dấu ‘/‘ thay vì ‘\‘ như thông thường; Dòng hai là đường dẫn lưu file log – đường dẫn này có một thư mục mà tên được lấy từ ngày hiện tại với format là “yyyy-MM-dd“.

III> Các kỹ thuật filter nâng cao trong log4net

Như chúng ta cũng biết ở bài trước, LogLevel cũng là một filter để chúng ta có thể tùy chọn nội dung log phù hợp, kèm theo đó trong mỗi Appender có các filter riêng. Hôm nay, chúng ta sẽ cùng tìm hiểu thêm về filter trong mỗi Appender .

Nhắc lại: bài trước nói về thẻ filter tôi nhắc đến ba loại như sau: StringMatchFilterLevelRangeFilterLevelMatchFilterDenyAllFilter; Hôm nay chúng ta có thêm một loại nữa là “LoggerMatchFilter

1) Cách tạo Whitelisting by logger – danh sách các namespace được phép ghi log

Format như sau

<filter type="log4net.Filter.LoggerMatchFilter">
  <loggerToMatch value="myNamspace.comm" />
</filter>
<filter type="log4net.Filter.DenyAllFilter" />

Bộ lọc LoggerMatchFilter mặc định giá trị của acceptOnMatchTrue, tức là bộ lọc này là bộ lọc cho phép(các giá trị thõa điều kiện của bộ lọc này thì sẽ được ghi ra file). Ví dụ rên đây sẽ chỉ ghi ra log cho các nội dung log thuộc namespace là “myNamspace.comm“, vì tất cả các log khác bị cấm (DenyAllFilter)

2) Cách tạo Blacklisting by logger – danh sách các namespace bị cấm ghi log

Format như sau

<filter type="log4net.Filter.LoggerMatchFilter">
  <loggerToMatch value="LoggerDeny" />
  <acceptOnMatch value="false" />
</filter>

Tất cả các log đều được ghi trừ log phát sinh tại namespace “LoggerDeny“, chúng ta làm điều này bằng cách set giá trị cho thẻ acceptOnMatch là False

3) Cách tạo bộ LoggerMatchFilter gộp

* Format của việc gộp các LoggerMatchFilter

<filter type="log4net.Filter.LoggerMatchFilter">
  <loggerToMatch value="Noisy.Namespace.But.Important" />
</filter>
<filter type="log4net.Filter.LoggerMatchFilter">
  <loggerToMatch value="Noisy.Namespace" />
  <acceptOnMatch value="false" />
</filter>

Ví dụ trên cho ta một file log chứa các log của namespace “Noisy.Namespace.But.Important” và các log của namespace “Noisy.Namespace” bị cấm ghi -> Song thực tế chúng ta không mấy khi dùng kiểu gộp này.

* Format của việc gộp LoggerMatchFilter với LevelRangeFilter hoặc StringMatchFilter

<appender name="AllLog" type="log4net.Appender.RollingFileAppender">
    <filter type="log4net.Filter.LoggerMatchFilter">
	<loggerToMatch value="myNamespace" />
	<acceptOnMatch value="false" />
    </filter>
    <filter type="log4net.Filter.LevelRangeFilter">
      <acceptOnMatch value="true" />
      <levelMin value="INFO" />
      <levelMax value="FATAL" />
    </filter>

    <!-- param...-->
 </appender>

<appender name="AllLog" type="log4net.Appender.RollingFileAppender">
    <filter type="log4net.Filter.LoggerMatchFilter">
	<loggerToMatch value="myNamespace" />
    </filter>
    <filter type="log4net.Filter.StringMatchFilter">
        <stringToMatch value="test" />
    </filter>
    <filter type="log4net.Filter.DenyAllFilter" />

    <!-- param...-->
 </appender>

Ví dụ này ghi tất cả các log có level từ INFO->FATAL và trừ log của namespace “myNamespace” hoặc ghi tất cả các log của namespace “myNamespace” và các log có chứa “test“.
Chú ý rằng: nếu trong bộ gộp các thẻ filter có kiểu LoggerMatchFilter chúng ta nên để thẻ filter này lên trên các thẻ filter khác.

Chúc các bạn thành công,

Phạm Tuân

Trả lời

Điền thông tin vào ô dưới đây hoặc nhấn vào một biểu tượng để đăng nhập:

WordPress.com Logo

Bạn đang bình luận bằng tài khoản WordPress.com Đăng xuất /  Thay đổi )

Google photo

Bạn đang bình luận bằng tài khoản Google Đăng xuất /  Thay đổi )

Twitter picture

Bạn đang bình luận bằng tài khoản Twitter Đăng xuất /  Thay đổi )

Facebook photo

Bạn đang bình luận bằng tài khoản Facebook Đăng xuất /  Thay đổi )

Connecting to %s