2009-10-09 40 views
22

Cơ sở khai thác gỗ nào bạn sử dụng whit Qt?Cơ sở ghi nhật ký và Qt

Bạn có chọn các phương thức qDebug(), qWarning(), qCritical(), qFatal() hoặc có thể giống như Log4cpp (Log4cplus, vv) hoặc có thể một số mã tùy chỉnh không?

Trả lời

10

Thư viện ghi nhật ký C++ hiện có quá nặng đối với sở thích của tôi, vì vậy tôi đã tạo giao diện người dùng tùy chỉnh dựa trên ý tưởng từ Logging in C++ cho phần cuối Qt qInstallMsgHandlerq. Đó là đa nền tảng và an toàn luồng. Một ngày nào đó tôi sẽ dọn sạch mã và giải phóng nó ra thế giới :)

Một giải pháp thay thế thú vị cho Qt là QxtLogger.

+0

Có lẽ QxtLogger là giải pháp tốt nhất cho các dự án dựa trên Qt. Chỉ có nhược điểm (theo ý kiến ​​của tôi), rằng logger này là một phần của thư viện khá lớn. Dù sao, cảm ơn cho lời khuyên của bạn. – cybevnm

+2

@vnm: Tôi đã xuất bản thư viện đăng nhập của mình tại http://bitbucket.org/razvanpetru/qt-components/downloads/ – rpg

+0

Ok.Tôi sẽ xem qua một chút. Cảm ơn – cybevnm

3

Tôi không sử dụng Qt, nhưng để đăng nhập, tôi đang sử dụng phiên bản sửa đổi của Dr'Dobb's Logging in C++. Mã ban đầu có thể được tìm thấy here.

Sửa đổi của tôi dành riêng cho nền tảng Microsoft Windows (fopen không cho phép chia sẻ tệp đọc) và có thể tìm thấy here.

+0

Trong Qt, một số lớp có một cơ sở tuần tự có thể đọc được khá dễ chịu, nên được gọi bằng thư viện Qt-logging tốt. Một khung công tác khai thác chung C++ ở đây không đủ tốt. –

1

Phụ thuộc vào cách bạn muốn sử dụng dữ liệu nhật ký đó.

Nếu nó được sử dụng để gỡ lỗi khi chạy, qWarning() sẽ hoạt động tốt.

Nếu bạn cần gỡ lỗi hồi tưởng (thường là mã phía máy chủ), các tệp văn bản thuần cũ là tốt nhất. Tốt nhất là tổ chức các tệp nhật ký này theo nhật ký ngày được viết.

4

Log4Qt là một cổng log4j nổi tiếng với thế giới Qt.

3

QDebug là cách tốt nhất để đi, vì nó thể hiện sự tích hợp ngoài hộp với phần còn lại của khung, không làm cho bạn phụ thuộc vào mã của bên thứ 3 và bao gồm tất cả các nhu cầu đăng nhập.

+2

Nhưng nó không đăng nhập vào tệp hoặc nhật ký sự kiện hệ thống. – philk

+0

Nó không làm điều đó theo mặc định, nhưng đó không phải là một mặc định tốt như đối với tôi. Nếu bạn muốn định tuyến lại qDebug, hãy tham khảo bài đăng này http://stackoverflow.com/questions/4954140/how-to-redirect-qdebug-qwarning-qcritical-etc-output –

+2

Tôi biết rằng bạn có thể định tuyến lại qDebug. Tuy nhiên nó không đủ linh hoạt cho một ứng dụng trưởng thành. – philk

10

Nếu bạn chỉ làm việc trong một chủ đề, qDebug và công việc đó khá tốt, hoặc bạn có thể sửa đổi chúng bằng cách cài đặt trình xử lý của riêng bạn với qInstallMessageHandler trong QT 5.0+ hoặc qInstallMsgHandler trong các phiên bản cũ.

Lưu ý: Các phiên bản cũ hơn của qDebug(), v.v., nơi bạn đã sử dụng qInstallMsgHandler (hiện không còn được dùng nữa, ví dụ: http://doc.qt.io/archives/4.6/qtglobal.html#qDebug) không an toàn cho chuỗi. Nếu bạn sử dụng các chủ đề, chúng sẽ bị hỏng/hỏng nặng. Bên trong nó đã sử dụng QTextStream, được reentrant, nhưng không thread-an toàn.

+0

+1 Thanx cho lời khuyên an toàn chủ đề qDebug –

+0

-1 'qDebug()' là an toàn chỉ. Chủ đề an toàn của 'QTextStream' không liên quan vì không có' QTextStream' được chia sẻ. Mỗi invokation của 'qDebug()' nhận được 'QTextStream' của chính nó. – Oktalist

+0

@Oktalist: Tôi không đồng ý với bạn: http://stackoverflow.com/a/23517726/1202500 - và câu trả lời (s) có/là chính xác kinh nghiệm của tôi ... – mozzbozz

2

Liên quan đến câu trả lời cho biết "Thật không may qDebug(), v.v. không an toàn chỉ. Nếu bạn sử dụng chủ đề, chúng sẽ bị hỏng/hỏng. Nội bộ nó sử dụng QTextStream, reentrant, nhưng không an toàn."

Tôi nghiêm túc nghi ngờ rằng, qDebug được thiết kế để sử dụng đồng thời. Nộp một lỗi nếu điều đó không đúng.

+0

Nguồn dường như là http://www.qtcentre.org/threads/28879-redirecting-qDebug-to-file-threading-question –

+1

Nghi ngờ hay không - không quan trọng. Trong năm 2011, trên ít nhất 1 nền tảng, sử dụng nó từ nhiều chủ đề đã làm sụp đổ. Nếu nó không được ghi nhận là an toàn cho luồng, thì nó sẽ được giả định là không an toàn luồng, vì việc triển khai có thể thay đổi - có nghĩa là nó không phải là lỗi nếu nó không hoạt động. Nếu bạn muốn đảm bảo rằng việc triển khai không thay đổi, thì bạn cần phải sao chép các chức năng, có nghĩa là bạn đang có hiệu quả viết phiên bản của riêng bạn anyway (chỉ với một khởi đầu). Nếu tài liệu nói rằng nó an toàn chỉ với một phiên bản cụ thể thì bạn có thể sử dụng nó. – DarrylC

+0

Bây giờ tài liệu được an toàn theo chủ đề: https://doc.qt.io/qt-5/qtglobal.html#qDebug – kkoehne

8

Vì Qt 5.2 hỗ trợ ghi nhật ký được phân loại: http://qt-project.org/doc/qt-5/qloggingcategory.html. Điều này cho phép bạn chia nhỏ các thông điệp đăng nhập của bạn thành một danh mục (phân cấp), và tinh chỉnh được ghi lại, và những gì không.

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