2010-04-06 41 views

Trả lời

10

Chúng có thể nhưng nếu một ứng dụng đang ghi tệp, ứng dụng khác rất có thể sẽ gặp lỗi nếu cần ghi vào nhật ký do thực tế ứng dụng đầu tiên sẽ giữ tệp mở để ghi . Nó luôn luôn là tốt nhất để có các nguồn đăng nhập chuyên dụng cho các ứng dụng của bạn - nếu bạn cần chia sẻ một bản ghi, hãy sử dụng một cơ sở dữ liệu vì nó được thiết kế để xử lý các ghi đồng thời.

Đây là một trong những điều sẽ hoạt động thực sự tốt trên máy tính của bạn khi bạn đang phát triển vì bạn không có khả năng tạo đủ đồng thời ghi vào tệp nhật ký để thông báo bất kỳ vấn đề nào. Khi ứng dụng của bạn bắt đầu gặp phải sự cố tải trọng nhiều hơn, vấn đề sẽ bắt đầu tự hiển thị và tại thời điểm đó, nó có thể tự biểu hiện theo những cách kỳ lạ. Tôi chắc chắn sẽ thử một giải pháp khác.

10

Tùy thuộc vào số LockingModel của FileAppender. Nếu đó là ExclusiveLock thì một quy trình khác không thể mở tệp để ghi. Cách thay thế là MinimalLock, nhưng nó không có nghĩa là cho mục đích này. Nó được thiết kế để cho phép một quá trình khác di chuyển hoặc xóa tệp.

+0

Có ai có kinh nghiệm chia sẻ về phương pháp này không? – SandRock

17

MinimalLock giải quyết một phần vấn đề (như @Mark đã đề cập), nhưng nếu bạn đang sử dụng RollingFileAppender, bạn sẽ gặp phải các sự cố khác. Khi tệp cuộn, bạn có thể thấy mình đang ở trong tình trạng chạy đua, trong đó một quá trình sẽ ghi đè tệp nhật ký mới được tạo của quy trình khác.

Các tùy chọn khác bao gồm RemoteLogger, nơi bạn có một máy chủ đơn giản được thiết lập để nhận và ghi lại các sự kiện ghi nhật ký được gửi bởi các quy trình khác. Tương tự, bạn có thể đăng nhập vào cơ sở dữ liệu SQL. Tôi đã viết một cách đơn giản nối thêm vào Redis; bạn cần một ứng dụng đơn giản để đọc từ Redis và ghi vào một tệp. Vấn đề với những cách tiếp cận này là tất cả họ đều đưa ra một điểm thất bại. Khi một cái gì đó không hoạt động bình thường thì thường là khi bạn cần các bản ghi nhiều nhất, và sau đó chúng có thể không có sẵn.

Vì vậy, giải pháp của tôi là tránh vấn đề hoàn toàn bằng cách có mỗi quá trình đăng nhập vào tệp riêng của nó. Điều này dễ thực hiện với thay đổi về cấu hình. Trong cấu hình (Rolling)FileAppender của bạn, sử dụng:

<file type="log4net.Util.PatternString" value="c:\mylog-[%processid].txt" /> 

ID tiến trình trở thành một phần của tên tệp. Có, điều này có nghĩa là bây giờ bạn có một số tệp nhật ký để lược bỏ, nhưng một trình tổng hợp tệp nhật ký như Graylog, Splunk hoặc Logscape có thể trợ giúp.

1

Hoặc bạn có thể sử dụng Mutex để khóa tài nguyên chung và do đó đồng bộ hóa quyền truy cập vào tệp nhật ký chung từ các quy trình khác nhau.

0

Có, có thể, như đã nêu ở trên, nhưng bây giờ tôi đã thực hiện một số thử nghiệm ứng suất trong trường hợp này.

Quá trình cài đặt khá đơn giản:

  1. dự án Web 1 thiết lập với một trang đăng nhập một mục đơn + một nút có thể tạo nên 1000 yêu cầu đến cùng một trang, với một bộ đếm trong URL (được chọn bởi câu lệnh đăng nhập).
  2. Dự án web 2 được thiết lập giống hệt nhau, đối với cùng một tệp nhật ký.

Khi cả hai nút được nhấp cùng một lúc, các mục nhập nhật ký được xen kẽ trong suốt nhật ký. NHƯNG, và đây là GOTCHA lớn, được đánh giá bởi bộ đếm yêu cầu kèm theo, rõ ràng là có điều kiện chủng tộc. Hầu như mỗi lần một dự án web thành công trong việc ghi nhật ký, một dự án khác không thành công (mục nhập bị bỏ qua).

Vì vậy, với lưu lượng truy cập tốt đối với nhật ký phổ biến này, về cơ bản bạn sẽ không đảm bảo về các báo cáo nhật ký nào thực sự kết thúc trong nhật ký. Kết luận là luôn có các tệp nhật ký cụ thể của dự án.

Kiểm tra được thực hiện với mặc định là "MinimalLock". Tôi cũng làm lại bài kiểm tra với "ExclusiveLock", chỉ để thấy rằng dự án web đầu tiên định cấu hình trình ghi nhật ký "thắng", về cơ bản khóa tất cả các yêu cầu khác để đăng nhập. Vì vậy, rõ ràng, đó là một không-đi là tốt.

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