2010-10-13 30 views
13

Tôi có một ứng dụng (ứng dụng máy chủ) cần một số lượng lớn nhật ký được triển khai và không nên quá ảnh hưởng đến hiệu suất bằng cách bật ghi nhật ký.ghi nhật ký đa luồng cho ứng dụng hiệu suất cao

Ứng dụng có một chuỗi chủ đề của chuỗi công việc thực hiện công việc. Ban đầu tôi sẽ chỉ đăng nhập vào các chủ đề hồ bơi thread, nhưng sau đó tôi cần phải khóa thực tế toàn bộ chủ đề và do đó, có ứng dụng 'đa luồng' của tôi.

Tôi đã xem xét các cách tốt hơn để đăng nhập từ nhiều luồng và tôi đã tìm thấy bằng cách sử dụng hàng đợi hoặc bộ đệm vòng có thể là một ý tưởng.

Ai có thể đề xuất (có lẽ từ kinh nghiệm) bất kỳ cách nào tốt để thực hiện ghi nhật ký hiệu quả (vào một tệp chủ yếu) cho một ứng dụng đa luồng cũng nên duy trì một chút?

Tôi muốn sử dụng Thư viện ghi nhật ký tăng cường.

+2

Có thể đáng để chỉ ra điều hiển nhiên: ngay khi bạn bắt đầu ghi nhật ký không đồng bộ, bạn cũng có nguy cơ mất một số mục nhập nhật ký cuối cùng nếu ứng dụng của bạn gặp sự cố. Kể từ khi ứng dụng chỉ ngay lập tức tiếp tục sau khi * bắt đầu * đăng nhập, bạn không có đảm bảo rằng tất cả các thông điệp tường trình đã thực sự được ghi ra đĩa vào bất kỳ thời điểm nào. – jalf

+0

@jalf: bạn đề nghị tôi làm gì sau đó? –

+0

Không có đầu mối. Phụ thuộc vào nhu cầu của bạn. Một cơ chế ghi nhật ký không đồng bộ có thể vẫn là cách tốt nhất để đi trong trường hợp của bạn, tôi chỉ đang chỉ ra một cảnh báo quan trọng mà bạn phải biết. Tất nhiên, một phương án thay thế có thể là ghi dữ liệu nhật ký vào một phương tiện nhanh hơn ổ cứng (ổ SSD? Kết nối mạng nhanh?), Do đó, nó không chặn ứng dụng máy chủ cho mili giây quý giá như viết ổ cứng. – jalf

Trả lời

6

Pantheios là thư viện ghi nhật ký nhanh nhất cho C++ ở ngoài đó, theo như tôi biết. Tôi khuyên bạn nên sử dụng nó thay vì Ghi nhật ký tăng cường. Với Pantheios bạn chỉ cần đăng nhập vào tập tin, và bạn không quan tâm từ chủ đề nào. Bạn có thể đặt tên luồng trong tiền tố logline nếu bạn muốn và nó làm mọi thứ cho bạn.

+0

Không nhất thiết phải nhanh nhất !! Bất kỳ nguồn nào từ nơi bạn nhận được dữ liệu này? – DumbCoder

+0

http://www.pantheios.org/performance.html –

+0

Xem phần kết luận cũng có, chúng có loại tuyên bố từ chối tốt đẹp! – DumbCoder

3

Cá nhân tôi sẽ nhìn vào Pantheios, nhìn thoáng qua và có vẻ thú vị, sẽ bao gồm điều đó trong một dự án tương lai của tôi.

Nếu bạn thực sự muốn sử dụng tính năng ghi nhật ký tăng cường, tôi sẽ sử dụng hàng đợi được đồng bộ xử lý tất cả khóa nội bộ để nhân viên của bạn không phải lo lắng về điều đó.

giả:

class SynchedQueue { 
     void write(text) { lock() logfile.write(text) unlock() } 

Hoặc nếu bạn thực sự muốn làm cho nó nhanh, sử dụng một hàng đợi bên trong và chuyển từ hàng đợi công cộng theo lô của dòng X tại một thời điểm. Hàng đợi công cộng không phải chờ tệp i/o có thể mất một thời gian dài relativily và hàng đợi riêng chỉ nhận được dòng hiếm khi. Mặc dù nó có lẽ sẽ vẫn chậm hơn Pantheios.

+0

+1 "lô X dòng tại một thời điểm" – n611x007

2

Apache log4cxx. Tôi đã thấy khá nhiều nơi mà nó đang được sử dụng rộng rãi. Và hầu hết trong số họ là các ứng dụng giao dịch, các ứng dụng độ trễ đa luồng và độ trễ thấp. log4cxx không thua kém bất kỳ thư viện ghi nhật ký nào và nó có sẵn cho C++ và Java (Apache log4j), 2 tôi đã sử dụng.

+1

Ai đã bỏ phiếu này và tại sao? – DumbCoder

+1

log4cxx có rò rỉ bộ nhớ! –

+0

@m_pGladiator - Từ đâu? Bất kỳ liên kết hoặc trải nghiệm cá nhân nào? – DumbCoder

0

Tôi không quen thuộc với thư viện Tăng cường ghi nhật ký, vì vậy tôi không thể nhận xét về điều đó.

NLog hỗ trợ ghi nhật ký từ C/C++ và COM (cũng như từ các ứng dụng .NET được quản lý). Không chắc chắn nếu nó có các đặc tính hiệu suất bạn đang có hay không.

Bạn cũng có thể xem xét ETW. Nó là một hệ thống ghi tốc độ cao được thực hiện trong nhân Windows.Tôi đã không sử dụng nó nhưng Microsoft dường như đang đẩy nó nhiều hơn một chút và làm cho nó dễ dàng hơn một chút để sử dụng với mỗi bản phát hành. Chúng chắc chắn làm cho việc sử dụng dễ dàng hơn từ mã được quản lý. Vì nó đứng ngay bây giờ, có vẻ như tôi có phần hơi phức tạp để có được thiết lập và sau đó để có được đầu ra. Tôi chưa bao giờ nhận ra rằng tôi đã nghiêm túc xem xét việc triển khai ETW, vì vậy tôi thực sự không thể nhận xét về mức độ dễ hay khó thực sự của nó.

+0

ETW thật tuyệt, việc ghi nhật ký sự kiện không có người nghe là thực tế miễn phí nhưng ngay cả với người nghe tôi đã tìm thấy một sự kiện nhật ký đơn lẻ dưới một micro giây. hãy cẩn thận chi phí tạo ra các giá trị của dấu vết mặc dù, tức là ToString ngẫu nhiên hoặc sử dụng phản chiếu ngầm có thể hoàn tác việc tăng tốc độ – galaktor

2

Tôi đang sử dụng và thực sự thích Petru Marginean's logging system. Nó thực sự là ánh sáng nhanh và gọn gàng. Phải mất một chút thời gian để tôi có thể điều chỉnh nó theo ý thích của mình, nhưng một khi bạn hiểu nó, nó là một vẻ đẹp và toàn bộ thư viện chỉ thực sự là 1 tập tin tiêu đề của 250 dòng, không nhiều xuyên qua.

Phần chậm nhất của nó là nó sử dụng một đối tượng với một ostringstream, nhưng tôi nghi ngờ bạn sẽ tìm thấy bất cứ điều gì nhanh hơn. Ít nhất không phải không có nhiều C hơn C++.

Trong số second article and version anh ấy cho biết cách anh ấy làm cho chuỗi đó an toàn.

Nếu bạn không thể tìm thấy mã nguồn, hãy cho tôi biết, tôi có nó. Tôi nhớ tôi đã phải tìm kiếm nó một chút.

+0

chia sẻ tâm trí với tôi mã nguồn của Petru? không thể tìm thấy nó. – athos

+1

@athos Theo như tôi thấy, bài viết gốc vẫn có liên kết đến mã, cho phiên bản thứ hai, đây là [link] (http://twimgs.com/ddj/images/article/2009/code/logcpp2 .zip) – nus

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