2010-01-07 32 views
23

Trong ứng dụng của tôi, tôi sử dụng log4net, với tất cả các loại tạo trình ghi nhật ký của riêng chúng dựa trên loại của chúng - ví dụ: :Có thể đặt tên logger ký tự đại diện trong cấu hình log4net không?

private static readonly ILog Log = LogManager.GetLogger(typeof(Program)); 

Khi tôi đang phát triển, tôi rời khỏi trình ghi nhật ký trên DEBUG để nắm bắt tất cả các bản ghi đầu ra từ mã của tôi.

Tuy nhiên, một thành phần của bên thứ ba cũng sử dụng phương pháp này tương tự, nhưng được tạo 100s của thông điệp log một giây, không ai trong số đó tôi quan tâm.

Có thể sử dụng một số loại wildcarding trong logger cấu hình, để buộc tất cả các logger của họ chỉ đăng nhập vào WARN, ví dụ :

<logger name="com.thirdparty.*"> 
    <level value="WARN"/> 
    </logger> 

[Ví dụ chính xác ở trên, sử dụng một * không hoạt động]

Trả lời

34

Bạn chỉ có thể chỉ định một phần của một namespace vì vậy nó sẽ áp dụng cho tất cả các thư trong namespace đó (bao gồm lồng nhau).

Dưới đây là ví dụ tôi thường sử dụng:

<root> 
    <level value="FATAL" /> 
    <appender-ref ref="RollingFile" /> 
    </root> 

    <logger name="MyCompany.Web" > 
    <level value="WARN" /> 
    <appender-ref ref="WebErrors" /> 
    </logger> 

    <!-- Will log all FATALs from NHibernate, including NHibernate.SQL and all the nested --> 
    <logger name="NHibernate" > 
    <level value="FATAL" /> 
    </logger> 

Bên cạnh đó tôi sẽ khuyên bạn nên đọc hướng dẫn. Nó cung cấp rất nhiều lời giải thích. Ví dụ: bạn có thể đọc khoảng Logger Hierarchy. Dưới đây là đoạn trích từ đó:

Một logger được cho là tổ tiên của logger khác nếu tên của nó tiếp theo một dấu chấm là một tiền tố của tên logger hậu duệ . Một logger được cho là cha mẹ của một logger con nếu có không có tổ tiên giữa chính nó và logger hậu duệ. Cấu trúc phân cấp hoạt động rất nhiều theo cùng một cách với không gian tên và phân cấp lớp trong .NET.

và cũng:

Cấp Inheritance: Mức thừa hưởng cho một logger X cho trước, tương đương với mức không null đầu tiên trong hệ thống phân cấp logger , bắt đầu từ X và tiến lên trong hệ thống phân cấp về phía trình ghi nhật ký gốc.

+0

@Dmitriy - Bạn nói đúng. Tôi không bao giờ biết rằng! Tôi gần như cảm thấy ngớ ngẩn khi hỏi bây giờ :). Cảm ơn câu trả lời. –

+0

Chà, tôi cũng thế. Đó là thông tin tuyệt vời. –

+0

BTW, tất cả đều được ghi lại trên trang web log4net. Tôi đã thêm liên kết vào câu trả lời. –

4

bạn không thể làm ngược lại những gì bạn đang yêu cầu. Ý tôi là chỉ cần đặt mức nhật ký mặc định thành cảnh báo rồi đặt bộ ghi nhật ký cụ thể mà bạn đã xác định là DEBUG.

Ngoài ra, bạn có thể đặt ngưỡng của người yêu cầu của mình thành DEBUG và yêu cầu người đặt ứng dụng khác đặt WARN.

Ví dụ:

<appender name="EventLogAppender" type="log4net.Appender.EventLogAppender"> 
    <applicationName value="Application" /> 
    <layout type="log4net.Layout.PatternLayout"> 
     <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" /> 
    </layout> 
    <threshold value="WARN" /> 
</appender> 

<appender name="SmtpAppender" type="log4net.Appender.SmtpAppender,log4net"> 
    <to value="[email protected]" /> 
    <from value="[email protected]" /> 
    <subject value="Notification" /> 
    <smtpHost value="server01" /> 
    <bufferSize value="1" /> 
    <lossy value="false" /> 
    <layout type="log4net.Layout.PatternLayout,log4net"> 
     <conversionPattern value="%property{log4net:HostName} :: %level :: %message %newlineLogger: %logger%newlineThread: %thread%newlineDate: %date%newlineNDC: %property{NDC}%newline%newline" /> 
    </layout> 
    <threshold value="DEBUG" /> 
</appender> 
+0

@Brian - Cảm ơn bạn đã trả lời. Có - tôi * có thể * nhưng vấn đề là tôi có nhiều loại. Để có một cách tiếp cận danh sách trắng để đăng nhập sẽ làm cho cấu hình đăng nhập của tôi rất lớn và khó sử dụng, đó là lý do tại sao tôi đã tự hỏi về cách tiếp cận danh sách đen. –

+0

Đã hiểu. Tôi đã chỉ đưa ra một cách tiếp cận có thể tùy thuộc vào bao nhiêu logger khác mà bạn đã xác định. Tôi đã cập nhật câu trả lời của mình để đề xuất xác định ngưỡng ở cấp ứng dụng. Sau đó, chỉ cần thay đổi thư viện của bên thứ ba để sử dụng một appender với ngưỡng thích hợp trong khi appender của bạn vẫn được thiết lập để DEBUG. –

+0

@Brian - cảm ơn đề xuất trong mọi trường hợp - đó là một cách tiếp cận tốt nếu bạn chỉ có một vài logger. Đối với phần thứ hai của đề xuất - trong trường hợp của tôi, tôi muốn cả hai đi đến cùng một mục tiêu (một tệp nhật ký duy nhất hoặc cửa sổ bảng điều khiển). Cách tiếp cận này sẽ vẫn hoạt động ở đó? –

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