Bối cảnh: Chúng tôi đang làm việc trên một ứng dụng đa luồng (Linux-C) theo mô hình đường ống.
Mỗi mô-đun có một luồng riêng và các đối tượng được đóng gói để xử lý dữ liệu; và mỗi giai đoạn có một hình thức trao đổi dữ liệu tiêu chuẩn với đơn vị tiếp theo.
Ứng dụng này không bị rò rỉ bộ nhớ và an toàn cho các luồng sử dụng các khóa tại điểm mà chúng trao đổi dữ liệu. Tổng số luồng là khoảng 15- và mỗi luồng có thể có từ 1 đến 4 đối tượng. Làm khoảng 25 - 30 đối tượng kỳ lạ mà tất cả đều có một số ghi nhật ký quan trọng phải làm.
Hầu hết các cuộc thảo luận tôi đã thấy về các cấp độ khác nhau như trong Log4J và đó là các bản dịch khác. Các câu hỏi lớn thực sự là về việc ghi nhật ký tổng thể nên thực sự xảy ra như thế nào?
Một cách tiếp cận là tất cả khai thác gỗ địa phương không fprintf
để stderr
. Stderr được chuyển hướng đến một số tập tin. Cách tiếp cận này rất tệ khi các bản ghi trở nên quá lớn.
Nếu tất cả các đối tượng khởi tạo logger cá nhân của họ - (khoảng 30-40 trong số họ) sẽ có quá nhiều tệp. Và không giống như ở trên, người ta sẽ không có ý tưởng về thứ tự thực sự của các sự kiện. Dấu thời gian là một khả năng - nhưng nó vẫn là một mớ hỗn độn để đối chiếu.
Nếu có một mẫu logger toàn cầu (singleton) duy nhất - nó gián tiếp chặn rất nhiều luồng trong khi một người đang bận ghi nhật ký. Điều này là không thể chấp nhận khi xử lý các chủ đề nặng.
Vì vậy, đâu là cách lý tưởng để cấu trúc các đối tượng đăng nhập? Một số thực hành tốt nhất trong các ứng dụng quy mô lớn thực tế là gì?
Tôi cũng rất thích học hỏi từ một số thiết kế thực tế của các ứng dụng quy mô lớn để lấy cảm hứng từ!
======
BIÊN TẬP:
Dựa trên cả hai câu trả lời ở đây là câu hỏi tôi còn lại với:
Cách thực hành tốt nhất về việc gán logger (hàng đợi ghi nhật ký) cho đối tượng: họ nên gọi một số global_api () hoặc logger nên được gán cho chúng trong hàm tạo. Khi các đối tượng ở một số thứ bậc sâu, cách tiếp cận sau này trở nên tẻ nhạt. Nếu họ đang gọi một số global_api () thì đó là loại khớp với Ứng dụng, vì vậy cố gắng sử dụng đối tượng này trong ứng dụng khác sẽ ném sự phụ thuộc này. Có cách nào sạch hơn cho việc này?