2009-10-05 40 views
8

Chúng tôi có một ứng dụng chạy trong nhiều luồng và sử dụng Log4Net làm khung đăng nhập. Chúng tôi đã gặp phải tình huống trong đó một số sự kiện nhật ký không được ghi lại. Như đã đề cập trong tài liệu, các FileAppender và các ứng dụng khác là "không an toàn cho các hoạt động đa luồng". Tôi đã tìm kiếm trên web các giải pháp hoặc Ứng dụng nhưng không thể tìm thấy bất kỳ trang web nào.
Bạn có biết một ứng dụng Log4Net an toàn đa luồng có sử dụng bộ đệm vòng hoặc hàng đợi để cung cấp hỗ trợ đa luồng không? Hay chúng ta nên sử dụng một khung ghi nhật ký an toàn đa luồng khác nhau?
Cảm ơn bạn trước!Ghi nhật ký an toàn đa luồng

+4

Bản sao của http://stackoverflow.com/questions/1294668 - về cơ bản, log4net sẽ sử dụng ứng dụng phù hợp cho bạn. –

+0

Cảm ơn câu trả lời. Tôi đã viết một số bài kiểm tra đơn vị xác nhận an toàn đa luồng Log4Net (xem câu trả lời dưới đây). –

Trả lời

13

tôi đã viết một số xét nghiệm đơn vị để tạo lại vấn đề: Một thử nghiệm tạo ra 50 chủ đề và mỗi thread logs 500 tin nhắn. Sau đó các dòng chữ được tính và kết quả là tôi nhận được 25.000 dòng (50 x 500) theo thứ tự khác nhau. Tôi đã thử nghiệm nó trên một lõi kép và trên một máy tám lõi.
tôi đã thử nghiệm một Logger tĩnh:

private static ILog StaticLog = log4net.LogManager.GetLogger(RepositoryName, "Static logger"); 

và với một Logger cho mỗi trường hợp của lớp thử nghiệm/thread:

ILog instanceLog = LogManager.GetLogger(RepositoryName, "Instance logger: " + ThreadId.ToString()); 


Và tất cả các bài kiểm tra là màu xanh lá cây.

Vì vậy, Log4Net hoạt động tốt và xử lý các kịch bản đa luồng tốt. Các tài liệu Appender nên được cập nhật và tuyên bố rằng các hoạt động đa luồng được hỗ trợ nếu API Logger được sử dụng đúng cách.

Tôi đoán vấn đề với các mục nhập nhật ký bị thiếu mà chúng tôi gặp phải trên máy của khách hàng là do các vấn đề khác. Có lẽ máy ảo hoặc phần cứng cơ bản bị hỏng.

Cảm ơn sự giúp đỡ của bạn!

8

Tôi chưa bao giờ sử dụng FileAppender và không thể nói nếu đó là chuỗi an toàn nhưng tôi chưa bao giờ gặp bất kỳ sự cố nào với RollingFileAppender. Các tài liệu nói rằng các thành viên của loại không phải là chủ đề an toàn, nhưng điều này sẽ được OK trừ khi bạn cố gắng trực tiếp viết thư cho appender. Bạn không cần phải thêm mã khóa riêng của bạn xung quanh gọi như:

log.Info("message"); 
+1

Có, log4net tự động khóa cuộc gọi nhật ký để không có vấn đề về luồng nào ở đây. –

+0

Vì vậy, bạn đang nói rằng Log4Net là đa luồng an toàn nếu nó được sử dụng thông qua API Logger? Vì vậy, tôi đoán có phải là vấn đề trong mã của chúng tôi đang sử dụng nó?
Trong mỗi lớp, chúng tôi đang tạo một trình ghi nhật ký như sau:

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

Nhưng chỉ một thể hiện của lớp này được sử dụng trong chuỗi. –

0

Đó là các thử nghiệm có màu xanh lá cây không có nghĩa là các dòng thực sự được ghi vào tệp, nhưng không có ngoại lệ. Hoặc bạn đã bao gồm kiểm tra đọc tập tin cho rằng trong thử nghiệm của bạn là tốt? Tôi gặp phải vấn đề tương tự sau khi tôi bật các khu vườn web trong IIS. Tại thời điểm đó, chỉ có một luồng là viết dòng vào tệp.

Thông tin thêm về nhiều chủ đề và log4net đây: herehere

+3

Kịch bản web-vườn nghĩa là IIS đang sử dụng nhiều * quy trình *, khác với nhiều * đề *. Nhiều luồng ghi vào FileAppender là tốt; nhiều quá trình ghi vào FileAppender sẽ gây ra lỗi do cách hệ thống tập tin hoạt động. – Bleaourgh

0

Các Log4Net là thread-an toàn, nhưng các appenders sử dụng có thể là một vấn đề. Người gửi tệp làm "chặn" khi được gọi. Điều này có nghĩa là trong ứng dụng của bạn, mọi bản ghi được gửi tới Log4Net đều phải hoàn tất mọi ứng dụng trước khi quay lại ứng dụng của bạn.

Đó là chủ đề an toàn, nhiều chủ đề có thể sử dụng Log4Net để đăng nhập tin nhắn, nhưng Log4Net được gọi là ứng dụng chờ cho các ứng dụng hoàn tất. Thời gian thực hiện ghi nhật ký được thêm vào thời gian đăng ký của bạn.

Điều này dễ dàng được chứng minh. Xem: https://www.codeproject.com/Tips/1219696/Log-Net-Singleton-Wrapper-for-Concurrent-Logging

Điều tôi đã làm là "bọc" các chức năng của Log4Net trong một bảng đơn tĩnh an toàn và sau đó đặt từng thông điệp tường trình vào hàng đợi đang chạy trong một chuỗi đồng thời.Điều này làm cho tất cả việc ghi nhật ký đồng thời với ứng dụng nhưng việc thực thi ứng dụng không đợi cho các trình bổ sung hoàn thành.

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