Log 4 Qt使用に関する使用

6809 ワード


概要      
    前の時間にlog 4 Qtを使ったことがありますが、ばらばらに使っただけです.綿密に研究していない.使えばいいという気持ちでやっと穴にぶつかった.ネット上でもLog 4 Qtの文章を系統的に紹介していません.今システムを紹介します.自分と他の人に役に立つことを望んでいます.log 4 QtはApacheのlog 4 jによって修正されており、すべての中で使われているときにjaveの影もあります.詳細な学習が必要な学生はlog 4 jの資料を検索することができます.log 4 Qtの資料が少なすぎて少なすぎます.
log 4 qt基本フレームワーク
           
logger
ログを書くのに使います.(ルートloggerと普通は従属関係に属する)Log 4 Qt::Logger::rootLogger()【ルートlogger】Log 4 Qt::Logger::Logger("XXX")【自分で命名できる】
Appender
ログの出力先、ファイル、コンソール、データベースなどのconsoleAppender(コンソールに出力する構成)FileAppender(ファイルに出力する構成).
Layout
ログの出力フォーマットを設定します.PartternLayout()フォーマット文字列からログイベントSimpleLayout()を出力 出力ログ・レコードのレベルとメッセージTTCCLayout():ログ・イベントの時間、スレッド名、Logger名、およびネストされた診断コンテキスト情報を出力します.
 インスタンスの使用
1.プロファイルによるloggerの使用
log 4 qtではQSettingsでconfigファイルを構成して直接使用します.コードは以下の通りです.
構成ログをファイルに出力するには、次の手順に従います.
LoggerFile クラスは単例モードを採用し、使用時にget_を呼び出すInstance()->debug(QString)直接出力;
logger_file.h
class LoggerFile : public QObject
{
    Q_OBJECT
public:
    explicit LoggerFile(QObject *parent = 0);
    ~LoggerFile();

    static LoggerFile *get_instance(const char *, int, const char *);
    static LoggerFile *get_instance();

    void init_file_setting();
    void init_file_logger();

    void debug(const QVariant&);
    void waring(const QVariant&);
    void info(const QVariant&);
    void error(const QVariant&);

private:
    Log4Qt::Logger *m_file_logger;
    QString m_file_path;
    QSettings *m_file_setting;
    static LoggerFile *m_instance;
    static QString m_filter;
};

 
logger_file.cc
LoggerFile* LoggerFile::m_instance = NULL;
QString LoggerFile::m_filter = "";

LoggerFile::LoggerFile(QObject *parent)
{
    setParent(parent);
    m_file_path = QDir::homePath() + "/.pangen_gui" + "/pgui_log/";
    init_file_setting();
    Log4Qt::PropertyConfigurator::configure(*m_file_setting);
    init_file_logger();
}

LoggerFile::~LoggerFile()
{
    delete m_instance;
    m_instance = NULL;
}

LoggerFile *LoggerFile::get_instance(const char *fileName, int lineNumber, const char *functionName)
{
    m_filter = QString("[FILE:%1, LINE(%2)]: ").arg(fileName).arg(lineNumber);
    QMutex m_mutex;
    m_mutex.lock();
    if(NULL == m_instance)
    {
        m_instance = new LoggerFile();
    }
    m_mutex.unlock();
    return m_instance;
}

LoggerFile *LoggerFile::get_instance()
{
    QMutex m_mutex;
    m_mutex.lock();
    if(NULL == m_instance)
    {
        m_instance = new LoggerFile();
    }
    m_mutex.unlock();
    return m_instance;
}

void LoggerFile::init_file_setting()
{
    QString configFile_path = QDir::homePath()+ "/.pangen_gui" + "/pgui_config";
    QDir dir(configFile_path);
    if (!dir.exists())
    {
        if(!dir.mkpath(configFile_path))
        {
            qDebug() << "make config_dir error !";
            return;
        }
    }
    m_file_setting = new QSettings(configFile_path + "/qtlogger_file.conf", QSettings::IniFormat);
    m_file_setting->clear();
    m_file_setting->setValue("log4j.rootLogger", "debug,dailyFile");
    m_file_setting->setValue("log4j.appender.dailyFile", "org.apache.log4j.DailyRollingFileAppender");
    m_file_setting->setValue("log4j.appender.dailyFile.File", m_file_path + QDateTime::currentDateTime().toString("yyyyMMdd")+ ".log");
    m_file_setting->setValue("log4j.appender.dailyFile.AppendFile", "true");
    m_file_setting->setValue("log4j.appender.dailyFile.layout", "org.apache.log4j.PatternLayout");
    m_file_setting->setValue("log4j.appender.dailyFile.layout.ConversionPattern", "%-d{yyyy-MM-dd HH:mm:ss.zzz} [%p] %m%n");
}

void LoggerFile::init_file_logger()
{
    QDir Log_Dir(m_file_path);
    if (!Log_Dir.exists())
    {
        if (Log_Dir.mkpath(m_file_path))
        {
            qDebug() << "make log file path error!";
        }
    }
    m_file_logger = Log4Qt::Logger::logger("File");
}

void LoggerFile::debug(const QVariant& Text)
{
    m_file_logger->debug(m_filter + Text.toString());
}

void LoggerFile::waring(const QVariant& Text)
{
    m_file_logger->warn(m_filter + Text.toString());
}

void LoggerFile::info(const QVariant& Text)
{
    m_file_logger->info(m_filter + Text.toString());
}

void LoggerFile::error(const QVariant& Text)
{
    m_file_logger->error(m_filter + Text.toString());
}

 
プロファイルのメソッドを使用して、ログをコンソールに出力します.
Logger_console.h
class LoggerConsole : public QObject
{
    Q_OBJECT
public:
    explicit LoggerConsole(QObject *parent = 0);
    ~LoggerConsole();

    const LoggerConsole& operator<

Logger_console.cc
LoggerConsole::LoggerConsole(QObject *parent):
       QObject(parent)
{
    init_console_setting();
    Log4Qt::PropertyConfigurator::configure(*m_console_setting);
    Log4Qt::LogManager::setHandleQtMessages(true);
    init_console_logger();
}

LoggerConsole::~LoggerConsole()
{
    delete m_instance;
    m_instance = NULL;
}

void LoggerConsole::init_console_setting()
{
   QString configFile_path = QDir::homePath()+ "/.pangen_gui" + "/pgui_config";
   QDir dir(configFile_path);
   if (!dir.exists())
   {
       if(!dir.mkpath(configFile_path))
       {
           qDebug() << "make config_dir error !";
           return;
       }
   }
   m_console_setting = new QSettings(configFile_path + "/qtlogger_console.conf", QSettings::IniFormat);
   m_console_setting->clear();
   m_console_setting->setValue("log4j.rootLogger", "DEBUG, console");
   m_console_setting->setValue("log4j.appender.console", "org.apache.log4j.ConsoleAppender");
   m_console_setting->setValue("log4j.appender.console.layout", "org.apache.log4j.PatternLayout");
   m_console_setting->setValue("log4j.appender.console.layout.ConversionPattern", "%-d{yyyy-MM-dd HH:mm:ss.zzz} [%p] %m%n");
}

const LoggerConsole&  LoggerConsole::operator<debug(m_filter + Text.toString());
}

void LoggerConsole::waring(const QVariant &Text)
{
    m_console_logger->warn(m_filter + Text.toString());
}

void LoggerConsole::info(const QVariant &Text)
{
    m_console_logger->info(m_filter + Text.toString());
}

void LoggerConsole::error(const QVariant &Text)
{
    m_console_logger->error(m_filter + Text.toString());
}

上で注意すべき関数 Log4Qt::PropertyConfigurator::configure(QSetting)
この関数はloggerのグローバルな構成を構成するために使用され、プログラムに2回異なる構成ファイルをロードすることはできず、ログ構成が混乱する. 
上記の2つの構成は単独で使用することが望ましい