Cách sử dụng log4net (đặt tên trình ghi nhật ký) đúng


83

Có hai cách để cấu hình và sử dụng log4net. Đầu tiên là khi tôi có thể định cấu hình appender của riêng mình và trình ghi liên kết:

<!-- language: xml -->

<appender name="myLogAppender" type="log4net.Appender.RollingFileAppender" >
    <file value="Logs\myLog.log" />
    <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date %level - %message%n" />
    </layout>
</appender>

<logger name="myLog">
    <level value="All"></level>
    <appender-ref ref="myLogAppender" />
</logger>

Và sau đó khi tôi muốn viết một cái gì đó vào nhật ký, tôi có thể làm như sau:

ILog log = LogManager.GetLogger("myLog");
log.Info("message");

Một cách khác để sử dụng nó là cấu hình root chi tiết như tôi muốn:

<!-- language: xml -->

<root>
    <level value="Error" />
    <appender-ref ref="myLogAppender" />
</root>

Và trong trường hợp này, tôi có thể ghi lại các thông báo như sau:

ILog log = LogManager.GetLogger(typeof(Bar));
log.Info("message");

Lợi ích của cách tiếp cận thứ hai là bạn có thể bật hoặc tắt một số thông báo một cách nhanh chóng. Nhưng vấn đề là tôi đang phát triển trong EPiServer CMS và nó có hệ thống ghi nhật ký riêng sử dụng log4net và nếu tôi bật ghi nhật ký thông tin ở cấp cơ sở, thì rất nhiều nhật ký hệ thống sẽ được ghi.

Bạn sử dụng log4net như thế nào? Mỗi phần của một hệ thống ghi trong trình ghi của riêng nó, hay mọi thứ được viết trong trình ghi mặc định và cấu hình quyết định phải làm gì tiếp theo?

Câu trả lời:


96

Về cách bạn ghi nhật ký tin nhắn trong mã, tôi sẽ chọn cách tiếp cận thứ hai:

ILog log = LogManager.GetLogger(typeof(Bar));
log.Info("message");

Trường hợp thư được gửi đến nhật ký ở trên sẽ được 'đặt tên' bằng cách sử dụng loại đủ điều kiện Bar, ví dụ:

MyNamespace.Foo.Bar [INFO] message

Ưu điểm của cách tiếp cận này là nó là tiêu chuẩn thực tế để tổ chức ghi nhật ký, nó cũng cho phép bạn lọc thông báo nhật ký của mình theo không gian tên. Ví dụ: bạn có thể chỉ định rằng bạn muốn ghi thông báo ở mức INFO, nhưng hãy nâng mức ghi Barcụ thể lên GỬI:

<log4net>
    <!-- appenders go here -->
    <root>
        <level value="INFO" />
        <appender-ref ref="myLogAppender" />
    </root>

    <logger name="MyNamespace.Foo.Bar">
        <level value="DEBUG" />
    </logger>
</log4net>

Khả năng lọc thông tin đăng nhập của bạn thông qua tên là một tính năng mạnh mẽ của log4net, nếu bạn chỉ đơn giản đăng nhập tất cả các tin nhắn của mình "myLog", bạn sẽ mất phần lớn sức mạnh này!

Về CMS EPiServer, bạn sẽ có thể sử dụng phương pháp trên để chỉ định một cấp độ ghi nhật ký khác cho CMS và mã của riêng bạn.

Để đọc thêm, đây là một bài báo codeproject tôi đã viết khi ghi nhật ký:


5
Bạn thậm chí có thể loại trừ khỏi phần nhật ký của không gian tên lớp để giảm nhiễu trong nhật ký bằng cách sử dụng PatternLayout logging.apache.org/log4net/release/sdk/… "Ví dụ: đối với tên trình ghi" abc ", pattern% logger {2} sẽ xuất "bc". "
AlfeG

7
private static readonly ILog log = LogManager.GetLogger (System.Reflection.MethodBase.GetCurrentMethod (). Khai báoType);
Casper Leon Nielsen

Tại sao cách tiếp cận thứ hai tốt hơn cách tiếp cận đầu tiên ?! Tên lớp là tĩnh và nếu bạn thay đổi nó, bạn cũng sẽ phải cập nhật tên trong trình ghi nhật ký, có bất kỳ điểm nào trong việc thực hiện một cuộc gọi phản chiếu chỉ để lấy tên lớp không?
MeTitus

1
@CasperLeonNielsen Bạn có thể giải thích điều đó khác với this.GetType()?
ErikE

2
@ErikE this.GetType () sẽ không khả dụng khi xác định thuộc tính tĩnh hoặc trong một lớp tĩnh hoặc bên ngoài một phương thức khởi tạo.
dhochee

11

Câu trả lời của tôi có thể đến muộn, nhưng tôi nghĩ nó có thể giúp ích cho người mới. Bạn sẽ không thấy nhật ký được thực thi trừ khi các thay đổi được thực hiện như bên dưới.

2 Tệp phải được thay đổi khi bạn triển khai Log4net.


  1. Thêm Tham chiếu của log4net.dll trong dự án.
  2. app.config
  3. Tệp lớp nơi bạn sẽ triển khai Nhật ký.

Bên trong [ app.config ]:

Đầu tiên, trong 'configSection', bạn cần thêm đoạn mã bên dưới;

<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />

Sau đó, trong khối 'cấu hình', bạn cần viết đoạn mã bên dưới. (Đoạn mã này được tùy chỉnh theo nhu cầu của tôi, nhưng nó hoạt động giống như sự quyến rũ.)

<log4net debug="true">
    <logger name="log">
      <level value="All"></level>
      <appender-ref ref="RollingLogFileAppender" />
    </logger>

    <appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
      <file value="log.txt" />
      <appendToFile value="true" />
      <rollingStyle value="Composite" />
      <maxSizeRollBackups value="1" />
      <maximumFileSize value="1MB" />
      <staticLogFileName value="true" />

      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date %C.%M [%line] %-5level - %message %newline %exception %newline" />
      </layout>
    </appender>
</log4net>

Lớp gọi bên trong :

Bên trong lớp mà bạn sẽ sử dụng log4net này, bạn cần phải khai báo đoạn mã bên dưới.

 ILog log = LogManager.GetLogger("log");

Bây giờ, bạn đã sẵn sàng ghi nhật ký cuộc gọi ở bất cứ đâu bạn muốn trong cùng lớp đó. Dưới đây là một trong những phương thức bạn có thể gọi khi thực hiện các thao tác.

log.Error("message");

Bạn không cần phải tạo ILogmột instance-member đúng không? Tôi đã hỏi cùng một câu hỏi chi tiết hơn ở đây nhưng có lẽ tôi có thể nhận được thông tin đầu vào của bạn?
Minh Tran

5

Thay vì đặt tên cho lớp đang gọi của mình, tôi bắt đầu sử dụng như sau:

private static readonly ILog log = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);

Bằng cách này, tôi có thể sử dụng cùng một dòng mã trong mọi lớp sử dụng log4net mà không cần phải nhớ thay đổi mã khi tôi sao chép và dán. Ngoài ra, tôi có thể tạo một lớp ghi nhật ký và để mọi lớp khác kế thừa từ lớp ghi nhật ký của mình.


0

Bất lợi của cách tiếp cận thứ hai là kho lưu trữ lớn với các trình ghi nhật ký được tạo. Trình ghi nhật ký này làm tương tự nếu root được xác định và trình ghi lớp không được định nghĩa. Kịch bản tiêu chuẩn trên hệ thống sản xuất đang sử dụng một số trình ghi nhật ký dành riêng cho nhóm lớp. Xin lỗi vì tiếng Anh của tôi.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.