我正在尝试使用QFile和QTextStream创建一个Logger类,但我找不到一种有效的方法。我只想在其中创建一个log(...)函数。
我知道如果我执行以下操作会有效:
void CLogger::log(QString strLog,int nType) {
QFile file(m_strFileName);
file.open( QIODevice::Append | QIODevice::Text );
QTextStream logStream(&file);
logStream << nType << "-" << strLog;
file.close();
}
但这是非常讨厌的。我不想在我插入的每个日志行创建一个QFile对象。
因此,我尝试了几种不同的方式:
1)(以QFile * m_pFile为成员)
CLogger::CLogger()
{
m_pFile = new QFile(m_strFileName);
}
void CLogger::log(QString strLog,int nType)
{
m_pFile->open( QIODevice::Append | QIODevice::Text );
QTextStream logStream(m_pFile);
logStream << nType << "-" << strLog;
m_pFile.close();
}
或
2)(使用QFile * m_pFile和QTextStream * m_pLogStream作为成员)
CLogger::CLogger()
{
m_pFile = new QFile(m_strFileName);
m_pFile->open( QIODevice::Append | QIODevice::Text );
m_pLogStream = new QTextStream(m_pFile);
}
void CLogger::log(QString strLog,int nType)
{
*m_pLogStream << nType << "-" << strLog;
}
在第一种情况下,我得到:
C2248:'QTextStream :: QTextStream':无法访问私有成员 在类'QTextStream'中声明
在第二个中,* m_pLogStream不等同于QTextStream&amp;。
我做错了什么?
答案 0 :(得分:4)
实际上,每次需要记录某事时打开(并关闭)日志文件并不是一个糟糕的解决方案(除非你每秒记录1000次......但是没有人能够处理这么多数据...)。这不仅可以让您拥有一个非常稳定的日志(因为您不会一直打开文件,因此您不依赖于冲洗系统的冲洗),而且还可以让您能够实现以下功能:滚动和其他细节。
如果您保持日志文件处于打开状态,如果出现意外的“崩溃”,您可能无法获得所有日志行,这取决于您的操作系统如何处理这个不合适的退出。
以下是我们用于记录的一段代码:
QMutexLocker locker(&m_lineLoggerMutex);
QFile f(getLogFileName());
doRollLogsIfNeeded(static_cast<qint64>(f.size() + lineToBelogged.length()));
// Do not open in append mode but seek() to avoid warning for unseekable
// devices, note that if open is made with WriteOnly without Append, the
// file gets truncated
if (!f.open(QIODevice::ReadWrite | QIODevice::Text))
{
QTextStream out(stdout);
out << "CANNOT OPEN LOG FILE: " << getLogFileName();
return;
}
// seek() does nothing on sequential devices, this is in essence what QFile
// does when Append flag is set in open() but without warning (on Qt 4.8.3)
// However, Qt 4.8.1 issues the warning, so check it explicitly
if (!f.isSequential())
{
f.seek(f.size());
}
QTextStream out(&f);
out << lineToBelogged;
这是一种方法,析构函数负责关闭设备。