// log.cpp
#include "log.h"
#include <QTextStream>
#include <QFile>
#include <QDir>
#include <QDateTime>
void customMessageHandler(QtMsgType type, const QMessageLogContext& context, const QString& msg);
Log::Log()
{
// 清空日志文件
QFile logFile("Log/administrators-log.txt");
if (logFile.exists()) {
logFile.remove();
}
qInstallMessageHandler(customMessageHandler);
}
Log::~Log()
{
}
void customMessageHandler(QtMsgType type, const QMessageLogContext& context, const QString& msg)
{
// 获取当前日期时间
QString currentDateTime = QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss");
// 构建日志信息
QString logMessage = QString("[%1] ").arg(currentDateTime);
switch (type) {
case QtDebugMsg:
logMessage += QString("Debug: %1").arg(msg);
break;
case QtWarningMsg:
logMessage += QString("Warning: %1").arg(msg);
break;
case QtCriticalMsg:
logMessage += QString("Critical: %1").arg(msg);
break;
case QtFatalMsg:
logMessage += QString("Fatal: %1").arg(msg);
break;
}
QDir path;
if (!path.exists("Log")) {
path.mkdir("Log");
}
// 写入日志文件
QFile logFile("Log/administrators-log.txt");
if (logFile.open(QIODevice::WriteOnly | QIODevice::Append)) {
QTextStream textStream(&logFile);
textStream << logMessage << endl;
logFile.close();
}
}
Qt+日志类+输出到文件当中
需积分: 0 69 浏览量
更新于2023-10-24
收藏 857B ZIP 举报
在IT开发过程中,日志记录是一项至关重要的任务,它能够帮助开发者追踪程序运行状态,定位和解决问题。在Qt框架下,我们可以通过自定义类来实现一个日志系统,将输出信息记录到文件中。本篇将详细介绍如何使用Qt创建一个简单的日志类,并将日志输出到文件。
`Log.h`文件是头文件,通常会包含类的声明。在`Log.h`中,我们可以定义一个名为`Log`的类,这个类的主要职责是管理日志的输出。以下是一个可能的`Log.h`内容:
```cpp
#ifndef LOG_H
#define LOG_H
#include <QObject>
#include <QFile>
#include <QTextStream>
#include <QDateTime>
class Log : public QObject
{
Q_OBJECT
public:
explicit Log(QObject *parent = nullptr);
~Log();
void setLogFile(const QString &fileName);
void debug(const QString &message);
void info(const QString &message);
void warn(const QString &message);
void error(const QString &message);
private:
QFile m_file;
QTextStream m_textStream;
};
#endif // LOG_H
```
在上面的代码中,`Log`类继承自`QObject`,这使得它可以利用Qt的信号和槽机制。类中定义了几个公共方法,如`setLogFile`用于设置日志文件名,以及`debug`、`info`、`warn`和`error`分别对应不同级别的日志输出。`m_file`和`m_textStream`是私有成员变量,用于打开和写入日志文件。
接下来,我们来看`Log.cpp`文件,这是实现文件,包含了`Log`类的方法定义:
```cpp
#include "Log.h"
Log::Log(QObject *parent) : QObject(parent)
{
m_file.setFileName("log.txt"); // 默认日志文件名
if (m_file.open(QIODevice::WriteOnly | QIODevice::Append)) {
m_textStream.setDevice(&m_file);
} else {
qWarning() << "无法打开日志文件: " << m_file.errorString();
}
}
Log::~Log()
{
m_file.flush();
m_file.close();
}
void Log::setLogFile(const QString &fileName)
{
m_file.setFileName(fileName);
if (m_file.open(QIODevice::WriteOnly | QIODevice::Append)) {
m_textStream.setDevice(&m_file);
} else {
qWarning() << "无法打开日志文件: " << m_file.errorString();
}
}
void Log::debug(const QString &message)
{
m_textStream << QDateTime::currentDateTime().toString("yyyy-MM-dd HH:mm:ss.zzz") << ": DEBUG - " << message << endl;
}
void Log::info(const QString &message)
{
m_textStream << QDateTime::currentDateTime().toString("yyyy-MM-dd HH:mm:ss.zzz") << ": INFO - " << message << endl;
}
void Log::warn(const QString &message)
{
m_textStream << QDateTime::currentDateTime().toString("yyyy-MM-dd HH:mm:ss.zzz") << ": WARN - " << message << endl;
}
void Log::error(const QString &message)
{
m_textStream << QDateTime::currentDateTime().toString("yyyy-MM-dd HH:mm:ss.zzz") << ": ERROR - " << message << endl;
}
```
在这个实现中,构造函数初始化了日志文件(默认为"log.txt"),并在文件可以打开时设置`m_textStream`。`setLogFile`方法允许动态更改日志文件名。每个日志级别的方法都包含当前时间戳,日志级别标识以及消息内容,便于后期分析。
在使用这个`Log`类时,只需在项目最开始的地方创建一个`Log`对象,例如:
```cpp
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
Log log; // 初始化日志类
// ... 其他代码 ...
return app.exec();
}
```
如果需要改变日志输出位置,可以在任何时间调用`setLogFile`方法,例如:
```cpp
log.setLogFile("/path/to/your/logfile.txt");
```
这样,我们就实现了一个简单易用的日志系统,它可以方便地在Qt应用程序中记录并查看日志信息。通过扩展这个基础结构,我们可以添加更多的功能,如日志级别过滤、日志滚动、网络传输等,以适应更复杂的应用场景。
这不就好起来了吗_88
- 粉丝: 33
- 资源: 9