下面就是“C++语言编写写日志类”的完整攻略:
1. 确定日志类的功能和需求
在编写日志类之前,需要考虑其功能和需求,如何记录日志、日志信息的格式、日志级别、日志存储路径等。根据实际需求设计日志类的各项功能,比如:
- 记录日志信息
- 支持不同的日志级别
- 支持自定义日志存储路径和文件名
- 自动切分日志文件
- 支持日志的异步输出,避免阻塞主线程等待写日志操作
在这里,我们以记录日志信息、支持日志级别、自定义日志存储路径为例进行说明。
2. 设计日志类的接口和实现
经过确定需求后,我们需要根据需求设计相应的接口和实现。
2.1 接口设计
- 枚举类型定义日志级别:
enum LOG_LEVEL
{
LL_DEBUG, // 调试信息
LL_INFO, // 普通信息
LL_WARNING, // 警告信息
LL_ERROR, // 错误信息
LL_FATAL, // 严重错误信息
};
- 日志类接口定义:
class Log
{
public:
// 单例模式,返回唯一的实例
static Log& getInstance();
// 切换输出到指定文件(默认输出到控制台)
void setLogFile(const std::string& fileName);
// 写日志
void writeLog(LOG_LEVEL level, const std::string& content);
private:
Log();
~Log();
Log(const Log&) = delete;
const Log& operator=(const Log&) = delete;
};
2.2 实现
- 单例模式的实现:
Log& Log::getInstance()
{
static Log log;
return log;
}
Log::Log()
{
// 打开文件,如果失败则输出到控制台
std::string fileName = "log.txt";
m_logFile.open(fileName, std::ios_base::out | std::ios_base::app);
if (!m_logFile.is_open())
{
std::cerr << "Failed to open the log file! Output to console." << std::endl;
}
}
Log::~Log()
{
if (m_logFile.is_open())
{
m_logFile.close();
}
}
- 切换输出文件的实现:
void Log::setLogFile(const std::string& fileName)
{
if (m_logFile.is_open())
{
m_logFile.close();
}
m_logFile.open(fileName, std::ios_base::out | std::ios_base::app);
if (!m_logFile.is_open())
{
// 如果打开失败则输出到控制台
std::cerr << "Failed to open the log file! Output to console." << std::endl;
}
}
- 写日志的实现:
void Log::writeLog(LOG_LEVEL level, const std::string& content)
{
// 构造日志信息
std::stringstream ss;
ss << "[" << getCurrentTime() << "] ";
switch (level)
{
case LL_DEBUG:
ss << "[DEBUG] ";
break;
case LL_INFO:
ss << "[INFO] ";
break;
case LL_WARNING:
ss << "[WARNING] ";
break;
case LL_ERROR:
ss << "[ERROR] ";
break;
case LL_FATAL:
ss << "[FATAL] ";
break;
default:
ss << "[UNKNOWN] ";
break;
}
ss << content << std::endl;
// 将日志写入文件(或输出到控制台)
if (m_logFile.is_open())
{
m_logFile << ss.str();
}
else
{
std::cout << ss.str();
}
}
其中,getCurrentTime() 函数用于获取当前时间,这里不再给出具体实现。需要注意的是,上述代码中使用了stringstream类来构造日志信息。
3. 示例说明
下面通过两个示例说明如何使用日志类。
3.1 示例1:输出日志信息
// 输出日志信息
Log::getInstance().writeLog(LL_INFO, "Hello, Log!");
// 输出调试信息
Log::getInstance().writeLog(LL_DEBUG, "This is debug information.");
这段代码将输出以下内容:
[2021-08-04 10:34:55] [INFO] Hello, Log!
[2021-08-04 10:34:55] [DEBUG] This is debug information.
3.2 示例2:将日志写入文件
// 切换输出文件
Log::getInstance().setLogFile("mylog.txt");
// 输出日志信息
Log::getInstance().writeLog(LL_INFO, "Hello, Log!");
// 输出调试信息
Log::getInstance().writeLog(LL_DEBUG, "This is debug information.");
这段代码将将日志信息写入到 mylog.txt 文件中。如果打开文件失败,则信息将输出到控制台。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++语言编写写日志类 - Python技术站