全面监控:系统日志分析与记录

全面监控:系统日志记录

系统日志是记录计算机系统各种活动和事件的文件或数据库。它们包含了系统的运行状态、错误信息、警告、用户操作记录等。

系统管理员和软件开发人员经常使用系统日志来诊断问题、监视系统性能和跟踪用户活动。

日志记录通常包括时间戳、事件类型、事件描述以及相关的详细信息。

通过分析系统日志,可以及时发现并解决系统故障、安全漏洞和其他问题

在实际的开发中 ,是有专门的开源框架的 , 我们只需要进行相应的部署和应用 。日志系统实际上很简单 , 没什么技术含量 。就是一些简单的输入输出。

目的就是,我们在打印日志的时候 , 不需要进行手动的 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

./configure

make

make 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;
}

达到的效果

在这里插入图片描述

  • 8
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

零二年的冬

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值