Trình ghi C ++ an toàn luồng hiệu quả nhất là gì? [đóng cửa]


85

Tôi đang làm việc trên một ứng dụng đa luồng quan trọng về hiệu suất. Tôi đã xem xét ghi nhật ký rlog, Ace và Boost. Tôi chọn rlog vì tôi đọc nó nhanh nhất (khi tắt tính năng ghi nhật ký, nó có ít chi phí nhất).

Vấn đề tôi gặp phải là nó hiển thị tên tệp, số dòng, v.v. ngay cả trong chế độ phát hành. Nếu bạn có thể cho tôi biết cách tắt thông tin đó, vấn đề của tôi có thể được giải quyết. Trong mọi trường hợp, trình ghi nhật ký hiệu quả nhất trong C ++ cho tình huống của tôi là gì?


23
Tôi nhanh chóng đi đến kết luận rằng boost có tất cả. Ngay cả khi nó không, nó sẽ xuất hiện khi bạn nhìn lại!
Martin Beckett

20
Tôi không thể hiểu tại sao nó bị đóng. Anh ấy hỏi một câu hỏi cụ thể và có thể đo lường được. Nếu chúng ta bỏ qua trình biên dịch nào đang được sử dụng, thì chỉ có thể có một "trình ghi C ++ an toàn hiệu quả nhất". Stackoverflow những ngày này ....
JohnJohn 10/02/15


Câu trả lời:


35

Rất tiếc, tôi không thể bỏ phiếu vào lúc này. Theo như tôi có thể nói không bao giờ sử dụng những thứ tào lao như Apache log4cxx. Nó chứa nhiều lỗi nghiêm trọng.

  1. Bản phát hành cuối cùng của nhánh 0.9 là 0.9.7 và vẫn bị rò rỉ bộ nhớ vì mọi lớp có thành viên ảo đều không có dtor ảo.
  2. Bản phát hành mới nhất 0.10.x bị mất nhiều chức năng từ 0.9.x và không tương thích ngược. Bạn buộc phải viết lại rất nhiều mã của riêng mình.
  3. Toàn bộ dự án dường như không có gì thay đổi. Việc phát hành 0.11.xx đã được công bố được 2 năm.

Theo tôi, bạn nên đi với boost.


10
"mọi lớp có thành viên ảo không có dtor ảo" đã không tin vào điều đó và phải kiểm tra nó. Apache khá khó chịu.
ManuelSchneid3r

6
Bạn có thể phản đối ngay bây giờ :)
Vụ kiện của Fund Monica

5
>> "mọi lớp có thành viên ảo không có dtor ảo" Mặc dù điều này không tuyệt vời nhưng không có nghĩa là nó gây ra vấn đề. Nó chỉ là một vấn đề nếu các lớp bị xóa bởi động của chúng thay vì loại tĩnh của chúng. Bản thân điều này không phải là một vấn đề và không có nghĩa là bất kỳ bộ nhớ nào cũng bị rò rỉ.
evilrix

1
@evilrix Các lớp thành viên ảo nhưng không có dtor ảo. Các lớp không có toán tử mới được bảo vệ / riêng tư. Trên thực tế, đây là một đoạn mã rất tệ và tồi tệ mà lẽ ra không bao giờ được phát hành. Vậy quan điểm của bạn là gì?
kirsche40

@ kirsche40 Tôi nghĩ rằng quan điểm của tôi khá rõ ràng. Bạn không hiểu phần nào trong lời giải thích của tôi về cách truyền từ tiêu chuẩn? Cho phép tôi diễn đạt lại cụm từ: đó là một vấn đề nếu bạn cố gắng xóa thông qua con trỏ lớp cơ sở. Trong trường hợp đó, nếu hàm hủy không phải là ảo, thì hành vi đó là không xác định. Tiêu chuẩn rõ ràng một cách bất thường về điểm này. Tôi khá chắc rằng không có gì tôi đã nói ngụ ý rằng tôi đang ủng hộ OP sử dụng điều này như một triển khai.
evilrix

19

Pantheios được cho là thư viện ghi nhật ký C ++ hoạt động tốt nhất , cũng như tuyên bố là thư viện duy nhất 100% an toàn kiểu (xem bài viết này về thư viện liên quan giải thích lý do tại sao các thư viện dựa trên printf () / iostream không phải là kiểu- an toàn)


4
Và ngay cả khi họ không thích Pantheios, danh sách 'đối thủ cạnh tranh' trên trang bạn đã liên kết vẫn chứa nhiều thông tin.
jwd

10

Tôi đã thành công với log4cxx tại http://logging.apache.org/log4cxx/index.html . Đây là phiên bản C ++ của trình ghi nhật ký Log4j phổ biến, dễ dàng định cấu hình thông qua tệp conf hoặc trong mã. Chi phí khi nó bị vô hiệu hóa là tối thiểu (gọi phương thức và so sánh số nguyên).

Mẫu cho đầu ra của nhật ký được xác định bởi một mẫu chuyển đổi có thể đơn giản như ngày / giờ và một thông báo. Nó cũng xử lý giới hạn kích thước tệp, cuộn qua, v.v. Bạn cũng có thể định cấu hình các mẫu khác nhau cho các lỗi và nguồn khác nhau.


9

Đây là cách bạn có thể tắt thông tin bổ sung mà rlog cung cấp (chẳng hạn như tên tệp, số dòng, v.v.). Khi bạn khởi tạo rlog trong main()hàm của mình (hoặc khi nào), bạn có thể làm như sau:

rlog::RLogInit(argc, argv);
rlog::StdioNode slog (2, rlog::StdioNode::OutputColor);
slog.subscribeTo( RLOG_CHANNEL("error") );

Đối số thứ hai StdioNodelà cho các cờ để kiểm soát đầu ra. Kiểm tra tài liệu rlog (có thể được tạo bằng Doxygen) để biết toàn bộ danh sách các cờ có thể có. Một trong ví dụ ở đây làm cho rlog chỉ tô màu đầu ra theo mức độ nghiêm trọng, mà không có bất kỳ thông tin nào khác được thêm vào.


9

Bạn có thể muốn xem xét hệ thống đăng nhập. logog cung cấp chính xác loại chức năng này nhưng nó không có các phụ thuộc mã ngầm mà Pantheios có. logog là chuỗi an toàn và nó cho phép kiểm soát mức độ cao đối với những loại thông báo được ghi vào bất kỳ thời điểm nào.

Tôi là tác giả và người bảo trì logog, vì vậy ý ​​kiến ​​của tôi hơi thiên vị. Nhưng tôi đã xem lại rlog, Pantheios và các hệ thống ghi nhật ký khác trước khi triển khai hệ thống này.

https://github.com/johnwbyrd/logog .


Liên kết cập nhật, cảm ơn bạn đã lưu ý.
johnwbyrd

4

Một số chi phí có thể xảy ra trong macro / luồng của bạn. Bạn cần phải rất cẩn thận để không tạo chuỗi được ghi khi việc ghi nhật ký bị vô hiệu hóa.

Sử dụng thông minh các luồng và toán tử?: Cho phép bạn làm điều đó, cũng như các macro.



2

có lẽ pantheios
mặc dù tôi không biết liệu nó có an toàn hay không ...


8
Nó an toàn theo chủ đề
dcw

2

hãy dùng thử c-log lib, https://github.com/0xmalloc/c-log , một lib log nhanh, ổn định và an toàn cho ngôn ngữ C / C ++.


8
Rất tiếc c-log thuộc GPL, có nghĩa là bạn không thể sử dụng nó với phần mềm không tương thích với GPL (ví dụ: thương mại độc quyền). Điều này làm cho nó không sử dụng được cho nhiều người dùng.
chris

bây giờ không có GIẤY PHÉP nào trong github.com/0xmalloc/c-log Nó miễn phí cho mục đích thương mại và cá nhân.
user2538508

2
Bạn có phải là tác giả của c-log? Nếu vậy, tôi thực sự khuyên bạn nên nêu rõ ràng (trên trang Github, tệp readme và nhận xét trong mã nguồn) theo giấy phép nào phần mềm của bạn được phát hành. Ngay cả khi nó có nghĩa là miền công cộng (mà tôi không khuyến khích!), Bạn nên nói rõ điều đó. Nói như vậy, có rất nhiều giấy phép mã nguồn mở "thân thiện với thương mại" (tức là được phép) để lựa chọn - phổ biến nhất là Apache, BSD hoặc MIT.
chris

Chỉ Linux? ( #include <pthread.h>...)
gỉyx
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.