2012-02-16 27 views
6

Có vẻ như có rất nhiều thông tin và tài liệu về cách đăng nhập thông tin bổ sung khi có ngoại lệ, nhưng tôi đang gặp khó khăn khi tìm cách tạo mục tiêu về cơ bản là một honeypot cho các ngoại lệ. Thay vì chọn lọc thông qua các tệp nhật ký khác nhau đang cố gắng xem có bất kỳ ngoại lệ nào được ghi lại hay không, tôi chỉ muốn một bản sao của tất cả các ngoại lệ để đi đến một mục tiêu cụ thể ghi vào tệp exceptions.log.Làm cách nào để định cấu hình mục tiêu NLog thành chỉ đăng nhập ngoại lệ?

Làm cách nào để thực hiện việc này?

Trả lời

17

Tôi không thể nói rằng tôi đã thực sự thử điều này, nhưng bạn có thể sử dụng when filtercondition để đạt được những gì bạn muốn.

Dưới đây là một ví dụ từ condition page:

<rules> 
    <logger name="*" writeTo="file"> 
     <filters> 
      <when condition="length(message) > 100" action="Ignore" /> 
      <when condition="equals('${logger}','MyApps.SomeClass')" action="Ignore" /> 
      <when condition="(level >= LogLevel.Debug and contains(message,'PleaseDontLogThis')) or level==LogLevel.Warn" action="Ignore" /> 
      <when condition="not starts-with('${message}','PleaseLogThis')" action="Ignore" /> 
     </filters> 
    </logger> 
</rules> 

Để đạt được mục tiêu của bạn, bạn có thể làm cho một filter như thế này:

<rules> 
    <logger name="*" writeTo="file"> 
     <filters> 
      <when condition="length('${exception}') > 0" action="Log" /> 
     </filters> 
    </logger> 
</rules> 

Ý tưởng được rằng bạn chỉ muốn ghi lại các tin nhắn nếu độ dài của chuỗi ngoại lệ là> 0. Một số ví dụ when condition sử dụng cú pháp NLog LayoutRenderer (ví dụ: ${message}) và một số không (ví dụ: message). Tôi không chắc chắn đó là chính xác hoặc cú pháp để sử dụng trong tình huống nào. Ví dụ tôi đã đăng trực tiếp ở trên có thể khiến tin nhắn được ghi CHỈ nếu có ngoại lệ. Bạn cũng nên có thể cấu hình sao cho thư của bạn đến một đích được ghi "bình thường" và thư đến "ExceptionHoneypotTarget" của bạn chỉ được ghi lại nếu có ngoại lệ.

Có lẽ một cái gì đó như thế này:

<rules> 
    <logger name="*" writeTo="ExceptionHoneypot"> 
     <filters> 
      <when condition="length('${exception}') > 0" action="Log" /> 
     </filters> 
    </logger> 
    <logger name="*" writeTo="file"> 
    </logger> 
</rules> 

Như tôi đã đề cập từ rất sớm, tôi đã không thực sự cố gắng nào của điều này, nhưng nó có vẻ như bạn sẽ có thể để làm điều đó, hy vọng tương tự như những gì trình bày ở trên .

Hoặc, bạn có thể sử dụng một số FilteringWrapper xung quanh HoneypotTarget. Cấu hình có thể giống như thế này:

<?xml version="1.0" ?> 
    <nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"  
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
     <targets> 
      <target name="Honeypot" xsi:type="FilteringWrapper" 
       condition="length('${exception}')>0"> 
      <target xsi:type="File" fileName="${basedir}/Honeypot.txt" /> 
      </target>  
      <target name="normal" xsi:type="File" fileName="${basedir}/Log.txt" /> 
      </target> 
     </targets>  
     <rules> 
      <logger name="*" minlevel="Debug" writeTo="Honeypot,normal" /> 
     </rules> 
    </nlog> 

tôi dựa ví dụ FilteringWrapper trên một ví dụ từ từ here. Cách nó sẽ hoạt động, nếu cấu hình của tôi là chính xác, là tất cả các thư sẽ được ghi vào "Log.txt" và các thư có ngoại lệ không null sẽ được ghi vào "Honeypot.txt".

+0

Ah lớn câu trả lời, cảm ơn. –

+0

Tôi đã thử giải pháp này nhưng tôi phải kèm theo $ {exception} trong các dấu nháy đơn như sau: length ('$ {exception}'). Tôi đã gửi bản sửa đổi mới để đánh giá ngang hàng. –

4

Xin lưu ý rằng nếu bạn muốn chỉ ngoại lệ bộ lọc của bạn nên là:

<when condition="length('${exception}') = 0" action="Ignore" /> 
Các vấn đề liên quan