全面监控:系统日志记录
系统日志是记录计算机系统各种活动和事件的文件或数据库。它们包含了系统的运行状态、错误信息、警告、用户操作记录等。
系统管理员和软件开发人员经常使用系统日志来诊断问题、监视系统性能和跟踪用户活动。
日志记录通常包括时间戳、事件类型、事件描述以及相关的详细信息。
通过分析系统日志,可以及时发现并解决系统故障、安全漏洞和其他问题
在实际的开发中 ,是有专门的开源框架的 , 我们只需要进行相应的部署和应用 。日志系统实际上很简单 , 没什么技术含量 。就是一些简单的输入输出。
目的就是,我们在打印日志的时候 , 不需要进行手动的 std::cerr""<<std::endl这样书写。一个完整的项目日志系统是不可缺少的。
比较好的开源项目 log4cpp : 一系列C++类库,灵活添加日志到文件,系统日志,IDSA和其他地方。
安装:
# 下载安装包
wget
https://sourceforge.net/projects/log4cpp/files/log4cpp-1.1.x%20%28new%29/log4cpp-1.1/log4cpp-1.1.4.tar.gz/download
# 解压
tar -xzvf log4cpp-1.1.4.tar.gz
cd og4cpp-1.1.4./configuremakemake install
具体用法可以区看官方的文档。
这里我给大家提供了一个简单的日志系统 ,创建一个日志类 , 可以直接拿来使用。
简单实现
#include <iostream>
#include <sstream>
#include <iomanip>
#include <ctime>
#include <chrono>
#include <thread>// 定义日志级别
enum class LogLevel {DEBUG,INFO,WARNING,ERROR
};class Logger {
private:LogLevel logLevel; // 日志等级// 获取当前时间戳std::string getTimeStamp() {auto now = std::chrono::system_clock::now(); //获取当前的系统时间戳// std::chrono::system_clock::to_time_t -> 转换成std::time_t 类型的对象 ,std::time_t 通常是一个整数类型// 大小是(1970年1月1日 00:00:00 以来的秒数。)auto time_t_now = std::chrono::system_clock::to_time_t(now);std::stringstream ss;/*std::localtime(&time_t_now),将 time_t_now 转换成本地时间返回类型是 tm* -> 结构体类型*/// put_time 将 tm 结构体格式化为字符串 ss << std::put_time(std::localtime(&time_t_now), "%Y-%m-%d %H:%M:%S");return ss.str();}// 获取当前线程的句柄std::string getCurrentThreadId() {std::stringstream ss;ss << std::this_thread::get_id();return ss.str();}public:Logger(LogLevel level = LogLevel::INFO) : logLevel(level) {}// 打印日志void log(LogLevel level, const std::string& message, const char* file, int line) {if (level < logLevel) {return;}std::cout << getTimeStamp() << " ";std::cout << "[" << getCurrentThreadId() << "] ";std::cout << "[" << file << ":" << line << "] ";switch (level) {case LogLevel::DEBUG:std::cout << "[DEBUG] ";break;case LogLevel::INFO:std::cout << "[INFO] ";break;case LogLevel::WARNING:std::cout << "[WARNING] ";break;case LogLevel::ERROR:std::cout << "[ERROR] ";break;}std::cout << message << std::endl;}void setLogLevel(LogLevel level) {logLevel = level;}void debug(const std::string& message, const char* file, int line) {log(LogLevel::DEBUG, message, file, line);}void info(const std::string& message, const char* file, int line) {log(LogLevel::INFO, message, file, line);}void warning(const std::string& message, const char* file, int line) {log(LogLevel::WARNING, message, file, line);}void error(const std::string& message, const char* file, int line) {log(LogLevel::ERROR, message, file, line);}
};// 宏定义简化日志输出
// __FILE__ 是一个预定义的宏,它代表当前源代码文件的名称
// __LINE__ 是一个预定义的宏,它代表当前源代码中的行号
#define LOG_DEBUG(logger, message) logger.debug(message, __FILE__, __LINE__)
#define LOG_INFO(logger, message) logger.info(message, __FILE__, __LINE__)
#define LOG_WARNING(logger, message) logger.warning(message, __FILE__, __LINE__)
#define LOG_ERROR(logger, message) logger.error(message, __FILE__, __LINE__)// 测试代码
int main() {Logger logger(LogLevel::DEBUG);LOG_DEBUG(logger, "This is a debug message.");LOG_INFO(logger, "This is an info message.");LOG_WARNING(logger, "This is a warning message.");LOG_ERROR(logger, "This is an error message.");return 0;
}