Làm thế nào để theo dõi các vấn đề log4net


191

Tôi sử dụng log4net mọi lúc, nhưng một điều tôi chưa bao giờ tìm ra là làm thế nào để nói những gì đang diễn ra bên trong. Ví dụ: tôi đã có một ứng dụng giao diện điều khiển và một ứng dụng cơ sở dữ liệu trong dự án của mình. Tôi đã thực hiện một vài thay đổi đối với cơ sở dữ liệu và mã, và bây giờ trình nối cơ sở dữ liệu không hoạt động nữa. Cuối cùng tôi sẽ hiểu tại sao, nhưng nó sẽ giúp ích rất nhiều nếu tôi có thể thấy những gì đang diễn ra bên trong log4net.

Log4net có tạo ra bất kỳ loại đầu ra nào mà tôi có thể xem để cố gắng xác định nguồn gốc của vấn đề không?

Câu trả lời:


293

Trước tiên, bạn phải đặt giá trị này trên tệp cấu hình ứng dụng:

<configuration>
   <appSettings>
      <add key="log4net.Internal.Debug" value="true"/>
   </appSettings>
</configuration>

Sau đó, để xác định tệp bạn muốn lưu đầu ra, bạn có thể thêm mã sau vào cùng tệp .config:

<configuration>
...

<system.diagnostics>
    <trace autoflush="true">
        <listeners>
            <add 
                name="textWriterTraceListener" 
                type="System.Diagnostics.TextWriterTraceListener" 
                initializeData="C:\tmp\log4net.txt" />
        </listeners>
    </trace>
</system.diagnostics>

...
</configuration>

Bạn có thể tìm thấy lời giải thích chi tiết hơn trong phần 'Làm cách nào để bật gỡ lỗi nội bộ log4net?' trong trang Câu hỏi thường gặp về log4net .


10
Chỉ cần đảm bảo rằng quy trình mà ứng dụng của bạn đang chạy có quyền đối với đường dẫn mà bạn muốn tạo tệp văn bản ghi nhật ký của mình ("C: \ tmp \ log4net.txt" trong ví dụ trên)
NMrt

3
Có vẻ như gỡ lỗi nội bộ không có dấu thời gian
snit80

4
Tôi đã thay đổi từ C:\tmp\log4net.txttới C:\log4net.txt, sau đó nó có thể tạo ra tập tin văn bản.
Frank Myat Thu

6
Chỉ cần một lưu ý tôi tìm thấy cách thú vị. Hãy chắc chắn rằng <configSections></configSections>mục đầu tiên bên dưới <configuration>. Nếu không, bạn kết thúc với một lỗi.
Nick

2
Điều này không hiển thị thời gian cho các mục trong tệp nhật ký. Tôi đã thử đặt thuộc tính traceOutputOptions="TimeStamp"traceOutputOptions="DateTime"trong addthẻ nhưng nó không thay đổi gì trong nội dung tệp nhật ký. Có ai biết cách thiết lập log4net để hiển thị thời gian cho mỗi dòng / mục trong tệp nhật ký theo dõi không?
Ulysses Alves

43

Nếu bạn đang sử dụng tệp cấu hình log4net, bạn cũng có thể bật gỡ lỗi ở đó bằng cách thay đổi nút trên cùng thành:

<log4net debug="true">

Điều này sẽ hoạt động khi cấu hình được tải lại và giả sử người nghe theo dõi của bạn được thiết lập đúng.


6
Khi cờ này được bật - bạn sẽ có thể thấy nhật ký chẩn đoán từ log4net trong cửa sổ đầu ra của Visual Studio
Naren

24

Ngoài câu trả lời ở trên, bạn có thể sử dụng dòng này để xem nhật ký trong thời gian thực thay vì đầu ra c: \ tmp \ log4net.txt.

log4net.Util.LogLog.InternalDebugging = true;

Ví dụ: trong một ứng dụng bảng điều khiển, bạn có thể thêm phần này và sau đó xem đầu ra trong thời gian thực. Thật tốt khi gỡ lỗi log4net trong một khai thác thử nghiệm nhỏ để xem những gì đang xảy ra với ứng dụng bạn đang thử nghiệm.


8

Hãy chắc chắn rằng ứng dụng gốc nơi điểm vào của bạn ghi nhật ký một cái gì đó vào log4net. Cung cấp cho nó một trong những điều sau:

private static ILog logger = LogManager.GetLogger(typeof(Program));
static void Main(string[] args)
{
    logger.InfoFormat("{0} v.{1} started.", Assembly.GetExecutingAssembly().GetName().Name, Assembly.GetExecutingAssembly().GetName().Version.ToString());

Với 2.0.8, tôi đã có một tình huống thú vị. Tôi đã tạo một dự án thư viện và một dự án exe thử nghiệm để giới thiệu khả năng của nó. Dự án thư viện đã được thiết lập để sử dụng Log4net như dự án exe. Dự án exe đã sử dụng thuộc tính assemblyinfo để đăng ký cấu hình, nhưng tôi không nhận được kết quả ghi nhật ký nào cho bàn điều khiển hoặc tệp nhật ký. Khi tôi bật ghi nhật ký gỡ lỗi nội bộ log4net, tôi nhận được một số thông báo nội bộ được ghi vào bảng điều khiển, nhưng vẫn không có nhật ký bình thường nào. Không có lỗi đã được báo cáo. Tất cả bắt đầu hoạt động khi tôi thêm đoạn mã trên vào chương trình của mình. Log4net đã được thiết lập chính xác.


1
tôi cũng đã cứu tôi :-)
costa

2

Nếu nhật ký nội bộ không cung cấp cho bạn đủ thông tin, việc xây dựng và gỡ lỗi mã nguồn rất dễ dàng . Nếu bạn không muốn kết hợp điều này với dự án phát triển của mình, hãy thêm một ứng dụng bảng điều khiển đơn giản vừa ghi nhật ký tin nhắn, sao chép dự án của bạn log4net.configvào ứng dụng này và gỡ lỗi lớp đang nghi vấn.


2

Trong log4net 2.0.8, dường như không thể thực hiện ghi nhật ký với log4net trong một DLL riêng biệt. Nếu tôi đã thử điều này, kết quả rất kỳ lạ: Không đăng nhập được thực hiện nữa. Và việc khởi tạo log4net với tùy chọn gỡ lỗi cho thấy không có lỗi.

Giống như K0D4 đã nói, bạn nên có một tham chiếu đến log4net trong mô-đun chính của mình và nó sẽ gọi một lần khi bắt đầu Chương trình và tất cả đều ổn.

Trong phiên bản tiếp theo của log4net, lỗi này có thể sẽ được sửa.

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.