Cấu Hình Hệ Thống Ghi Nhật Ký Log4Qt Trong Môi Trường Qt

Quản lý log hiệu quả là yếu tố quan trọng khi phát triển ứng dụng phức tạp bằng Qt. Thư viện Log4Qt cung cấp một giải pháp mạnh mẽ tương thích với kiến trúc của Apache Log4j nhưng được tối ưu hóa cho môi trường C++/Qt. Bài viết dưới đây sẽ hướng dẫn quy trình tích hợp, xây dựng và cấu hình chi tiết để sử dụng thư viện này trong dự án.

1. Chuẩn bị Mã Nguồn

Bạn có thể truy cập kho lưu trữ chính thức hoặc bản fork ổn định để lấy mã nguồn phiên bản 1.5.1. Sau khi tải về và giải nén, bạn không cần toàn bộ dự án mà chỉ trích xuất các thành phần cốt lõi sau:

  • Tập tin đầu vào build.pri
  • Tập tin cấu hình g++ g++.pri
  • Toàn bộ thư mục src chứa mã nguồn thư viện

2. Điều Chỉnh Tập Tin .pro

Thay vì nhúng các đường dẫn cứng nhắc vào tập tin dự án, hãy định nghĩa biến tổng quát để quản lý dễ dàng hơn. Thêm nội dung sau vào file .pro của bạn:

##############################
# Thiết lập biến thư mục
##############################
LOG4QT_SRC     = ./Libraries/Log4Qt-1.5.1
LOG4QT_BUILD   = $$LOG4QT_SRC/build.pri
LOG4QT_GPP     = $$LOG4QT_SRC/g++.pri
LOG4QT_CORE    = $$LOG4QT_SRC/src/log4qt/log4qt.pri

##############################
# Khai báo mô-đun và macro
##############################
QT             += concurrent
DEFINES        += LOG4QT_LIBRARY
DEFINES        += LOG4QT_EXPORT

##############################
# Đường dẫn tìm kiếm bao gồm
##############################
INCLUDEPATH    += $$LOG4QT_SRC/src
INCLUDEPATH    += $$LOG4QT_SRC/src/log4qt
DEPENDPATH     += $$LOG4QT_SRC/src/log4qt

##############################
# Nhúng cấu hình
##############################
include($$LOG4QT_CORE)
include($$LOG4QT_BUILD)
include($$LOG4QT_GPP)

3. Xử Lý Lỗi Biên Dịch

Trong quá trình xây dựng ở các phiên bản mới, có thể gặp lỗi liên quan đến việc thiếu header đối với QStringBuilder. Hãy thực hiện sửa đổi thủ công tại tệp:

Log4Qt-1.5.1/src/log4qt/dailyfileappender.cpp

Và thêm dòng khai báo vào vị trí phù hợp:

#include <QStringBuilder>

4. Khởi Tạo Bộ Gợi Ý Qua C++

Thay vì phụ thuộc hoàn toàn vào cấu hình bên ngoài, bạn có thể cài đặt appender cho cửa sổ đầu ra (Console) trực tiếp trong hàm main. Cách làm này giúp kiểm soát luồng log ngay từ lúc khởi động chương trình:

#include "mainwindow.h"
#include <QApplication>
#include <QDebug>
#include 
#include 
#include 
#include 
#include <QTextCodec>

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);

    // 1. Load cấu hình cơ sở
    PropertyConfigurator::configure("logging.properties");
    
    // 2. Kích hoạt xử lý thông báo Qt trong log manager
    LogManager::setHandleQtMessages(true);

    // 3. Lấy Logger gốc và cấu hình
    Logger *rootLogger = LogManager::logger();
    rootLogger->setLevel(Level::DEBUG_INT);

    // 4. Định dạng hiển thị thông điệp
    PatternLayout *formatter = new PatternLayout();
    formatter->setMessageFormat("%d{yyyy-MM-dd HH:mm:ss.zzz} [%t] %p %m%n");
    formatter->activateOptions();

    // 5. Cài đặt Console Appender
    ConsoleAppender *consoleSink = new ConsoleAppender();
    consoleSink->setName("StdoutAppender");
    consoleSink->setLayout(formatter);
    consoleSink->setEncoding(QTextCodec::codecForName("UTF-8"));
    consoleSink->setTarget(ConsoleAppender::STDERR_TARGET);
    consoleSink->setImmediateFlush(true);
    consoleSink->activateOptions();

    // 6. Gắn Appender vào Logger
    rootLogger->addAppender(consoleSink);

    // --- Đoạn mã thử nghiệm ---
    qDebug() << "Thông báo Debug đã ghi";
    qInfo() << "Thông báo Info đã ghi";
    qWarning() << "Cảnh báo hệ thống";
    qCritical() << "Lỗi nghiêm trọng xảy ra";

    MainWindow win;
    win.show();
    return app.exec();
}

5. Cấu Hình Lưu Trữ Vào Tập Tin

Sử dụng tập tin logging.properties để định nghĩa cách ghi log vào đĩa cứng. Chúng ta sẽ dùng DailyRollingFileAppender để tự động tách nhật ký theo ngày tháng.

log4j.logger.org.apache=ERROR
log4j.rootLogger=WARN, fileDest

# Định nghĩa Appender tên là fileDest
log4j.appender.fileDest=org.apache.log4j.DailyRollingFileAppender
log4j.appender.fileDest.File=output/application_log.txt
log4j.appender.fileDest.Append=true
log4j.appender.fileDest.DatePattern='yyyy-MM-dd-hh'.log

# Bố cục định dạng dữ liệu
log4j.appender.fileDest.layout=org.apache.log4j.PatternLayout
log4j.appender.fileDest.layout.ConversionPattern=%d %-5p [%c]%m%n

6. Sao Tách Tập Tin Cấu Hình

Để đảm bảo chương trình tìm thấy file logging.properties khi chạy trên máy khách, cần thêm lệnh sao chép nó vào thư mục output trong quá trình build:

PREFIX_OUTPUT = $$(OUT_PWD)
DISTFILES += \
    logging.properties

COPY_CMD = $(COPY_FILE_IXP) \"$$replace(PWD, /, \\)/logging.properties\" \"$$replace(OUT_PWD, /, \\)\\\"
first.depends += $(first) 
export(first.depends)
export(COPY_CMD)

# Mục tiêu build tùy chỉnh
QMAKE_EXTRA_TARGETS += pre_build

Thẻ: Qt Framework Log4Qt C++ Logging QMake DailyRollingFileAppender

Đăng vào ngày 8 tháng 6 lúc 21:42