Log 4 Qt使用に関する使用
概要
前の時間に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つの構成は単独で使用することが望ましい