2009-11-25 38 views
12

Có thể chèn thêm các trường vào cơ sở dữ liệu và sử dụng chúng trong log4net không? Tôi có một UserId tôi muốn có trong một trường phụ trong log-table.Log4Net và các trường bổ sung

Tôi đã thêm lĩnh vực này trong log4net.config:

<parameter> 
    <parameterName value="@userid" /> 
    <dbType value="guid" /> 
    <layout type="log4net.Layout.RawPropertyLayout" /> 
</parameter> 

Nhưng làm thế nào để cập nhật giao diện ILog để hỗ trợ các lĩnh vực cơ sở dữ liệu phụ. Vì vậy, tôi có thể đăng nhập ví dụ:

log4net.LogManager.GetLogger("logname").Fatal(message, exception, userid); 

Trả lời

19

Bạn có thể sử dụng tính năng "ngữ cảnh" trong log4net. Về cơ bản nó cho phép bạn thiết lập các thuộc tính mà bạn có thể sử dụng trong appender log của bạn. Bạn có thể đặt các thuộc tính này ở các phạm vi khác nhau (Toàn cầu, Chủ đề, v.v.). Trong trường hợp của bạn tôi nghĩ bạn có thể đi (ví dụ, chỉ sau khi người dùng đã đăng nhập):

log4net.ThreadContext.Properties["userid"] = userid; 

trong tập tin cấu hình của bạn, sau đó bạn có thể sử dụng tài sản này và thêm nó vào appender khai thác gỗ. Tôi nghĩ rằng nó sẽ là một cái gì đó như thế này cho các AdoNetAppender

<parameter> 
    <parameterName value="@userid" /> 
    <dbType value="guid" /> 
    <layout type="log4net.Layout.PatternLayout"> 
     <conversionPattern value="%property{userid}" /> 
    </layout> 
</parameter> 

Xin lưu ý rằng tôi đã không thu thập bất kỳ của các đoạn trên, vì vậy họ có thể cần một số tinh chỉnh, nhưng nó sẽ cho bạn một ý tưởng chung về cách này có thể được giải quyết.

Bạn có thể đọc thêm về điều này here.

Ps. Tôi nghĩ rằng MDC.Set được gọi trong câu trả lời đầu tiên là lỗi thời.

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